Промежуточное ПО owin с IdentityServer3.AccessTokenValidation в ASP.NET 5? возвращает исключение нулевого объекта

Я пытаюсь заставить IdentityServer3.AccessTokenValidation работать в веб-приложении ASP.NET 5, но приведенный ниже код выдает нулевое исключение. Я что-то упустил?

project.json — зависимости (частичные)

"IdentityServer3.AccessTokenValidation": "2.0.0-build00019",
"Microsoft.AspNet.WebApi.Owin": "5.2.3",
"Microsoft.Owin.Host.SystemWeb": "3.0.1",
"Microsoft.AspNet.Authentication.OAuthBearer": "1.0.0-beta6",
"Microsoft.Owin.Security.OAuth": "3.0.0",
"Microsoft.AspNet.Owin": "1.0.0-beta6",
"Microsoft.AspNet.Authorization": "1.0.0-beta6",
"Microsoft.IdentityModel.Protocol.Extensions": "1.0.0",
"Newtonsoft.Json": "6.0.6"

Startup.cs

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
        {
            Authority = "https://localhost:44300/",
            RequiredScopes = new[] { "api1" }
        });

Метод расширения

    public static void UseIdentityServerBearerTokenAuthentication(this IApplicationBuilder app, IdentityServerBearerTokenAuthenticationOptions options)
    {
        app.UseOwin(addToPipeline =>
        {
            addToPipeline(next =>
            {
                var builder = new Microsoft.Owin.Builder.AppBuilder();

                builder.UseIdentityServerBearerTokenAuthentication(options);

                var appFunc = builder.Build(typeof(Func<IDictionary<string, object>, Task>)) as Func<IDictionary<string, object>, Task>;
                return appFunc;
            });
        });
    }

Следующая строка продолжает вызывать исключение нулевого объекта, но не может определить, чего не хватает.

builder.UseIdentityServerBearerTokenAuthentication(options);

Трассировки стека

At IdentityServer3.AccessTokenValidation.DiscoveryDocumentIssuerSecurityTokenProvider..ctor(String discoveryEndpoint, IdentityServerBearerTokenAuthenticationOptions options, ILoggerFactory loggerFactory) in c:\projects\thinktecture-identityserver-v3-  accesstokenvalidati\source\AccessTokenValidation\Plumbing\DiscoveryDocumentIssuerSecurityTokenProvider.cs:line 43
at Owin.IdentityServerBearerTokenValidationAppBuilderExtensions.ConfigureLocalValidation(IdentityServerBearerTokenAuthenticationOptions options, ILoggerFactory loggerFactory) in c:\projects\thinktecture-identityserver-v3-accesstokenvalidati\source\AccessTokenValidation\IdentityServerBearerTokenValidationAppBuilderExtensions.cs:line 100
at Owin.IdentityServerBearerTokenValidationAppBuilderExtensions.UseIdentityServerBearerTokenAuthentication(IAppBuilder app, IdentityServerBearerTokenAuthenticationOptions options) in c:\projects\thinktecture-identityserver-v3-accesstokenvalidati\source\AccessTokenValidation\IdentityServerBearerTokenValidationAppBuilderExtensions.cs:line 50
at Portal.IdentityServerAccessTokenValidationAppBuilderExtensions.<>c__DisplayClass0_0.<UseIdentityServerBearerTokenAuthentication>b__1(Func`2 next) in C:\code\Sense.Care\src\Portal\Configuration\IdentityServerAccessTokenValidationAppBuilderExtensions.cs:line 23
at Microsoft.AspNet.Builder.OwinExtensions.<>c__DisplayClass0_1.<UseOwin>b__1(RequestDelegate next1)
at Microsoft.AspNet.Builder.Internal.ApplicationBuilder.Build()
at Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplication()
at Microsoft.AspNet.Hosting.Internal.HostingEngine.Start()
at Microsoft.AspNet.Loader.IIS.RuntimeHttpApplication.ApplicationStart(IHttpApplication application)
at Microsoft.AspNet.Loader.IIS.HttpApplicationBase.InvokeApplicationStart(IHttpApplication application)

Я использую сервер идентификации ниже

https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/AspNet5Host


person Madu Alikor    schedule 13.08.2015    source источник


Ответы (1)


У меня также было это исключение NullPointerException. Проблема в том, что метод app.GetLoggerFactory(); (из IAppBuilder) возвращает null. В моем случае этот метод возвращает null после вызова

app.Map("/admin", adminApp =>
        {
            var factory = new IdentityManagerServiceFactory();
            factory.ConfigureSimpleIdentityManagerService();

            adminApp.UseIdentityManager(new IdentityManagerOptions()
            {
                Factory = factory
            });
        });

Таким образом, размещение метода builder.UseIdentityServerBearerTokenAuthentication(options); перед app.Map решает проблему NullPointer. Но теперь у меня проблема, кажется, невозможно разместить WebApi и IdentityServer в одном проекте, но это уже другая проблема.

person huer12    schedule 13.08.2015
comment
Удалось ли вам заставить это работать в ASP.NET 5? метод расширения, определенный в пакете слепков IdentityServer3.AccessTokenValidation, был разработан только для OWIN, поэтому я использовал пакет Microsoft.AspNet.WebApi.Owin, который содержит метод расширения UseOwin, который можно использовать для соединения OWIN и ASP.NET 5. - person Madu Alikor; 16.08.2015
comment
Да, это работает. Таким образом, WebApi и IdentityServer могут работать в одном и том же приложении, которое вы должны использовать ValidationMode = ValidationMode.ValidationEndpoint. В противном случае он пытается обнаружить данные во время запуска, и в этот момент IdentityServer не работает. - person huer12; 17.08.2015