身份服务器 - 承载令牌身份验证 - 如何跟踪失败的授权?

时间:2016-10-17 14:32:39

标签: asp.net owin identityserver3

我在我的开发环境中设置了一个简单的身份服务器,配置如下:

    public void Configuration(IAppBuilder app)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Verbose()
            .WriteTo.Trace()
            .CreateLogger();

        app.Map("/identity", id =>
        {     
            id.UseIdentityServer(new IdentityServerOptions()
            {
                SiteName = "Tomas Services Identity Provider",
                SigningCertificate = CertificateService.Load(),
                Factory = IdentityFactory.Configure("IdServerConn"),
                RequireSsl = false
            });
        });
    }

工厂根据编写服务器代码的好人提供的实体框架示例进行设置。

然后我设置了一个客户端web api站点来使用承载认证,如下所示:

    private const string IdentityServerUrl = "http://localhost/mysite/identity";

    public void Configuration(IAppBuilder app)
    {
        Log.Logger = new LoggerConfiguration()
           .MinimumLevel.Debug()
           .WriteTo.Trace()
           .CreateLogger();

        app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions()
        {
            Authority = IdentityServerUrl,
            RequiredScopes = new[] { "my_scope" }
        });

        var config = new HttpConfiguration();

        WebApiConfig.Register(config);

        app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel).UseNinjectWebApi(config);
    }

然后我使用fiddler对其进行测试,检索访问令牌,然后将其添加到我的web api POST中的相应标头中。

现在,这是使用IIS express并在https下运行。我想更改此(用于开发)以在没有SSL的情况下运行。唯一的更改是在IDP配置中将RequiresSSL设置为false并更改客户端中的权限的URL。客户端现在也在http下而不是在SSL下运行。

我现在在发布到网络API时始终获得401 - 未经授权的回复。我可以毫无问题地检索访问令牌,但我无法理解为什么我的网站API网站没有对我进行身份验证。

我在身份服务器站点上设置了日志记录,我可以通过调用来获取访问令牌没有问题,但是当我通过Web API调用时,我看到的唯一进一步的日志记录是一次性的:

  

w3wp.exe信息:0:20​​16-10-17 15:09:58.459 +01:00 [信息]   启动发现请求2016-10-17 15:09:58.460 +01:00 [Debug] Cache   miss:CachingScopeStore.allscopes.public w3wp.exe信息:0:   2016-10-17 15:09:58.549 +01:00 [信息]开始密钥发现   请求

有没有办法从UseIdentityServerBearerTokenAuthentication OWIN中间件进一步记录(出于调试目的)?我在这里失去了为什么我无法连接,特别是因为这是在IIS express(在SSL下的albiet)下工作。

对于后人,我在下面的@leastprivilege中启用日志记录的错误是:

  

Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationMiddleware   错误:0:身份验证失败System.TypeLoadException:无法   从中加载类型'IdentityModel.Extensions.HashStringExtensions'   程序集'IdentityModel,版本= 2.0.0.0,文化=中立,   公钥=空”。在   IdentityServer3.AccessTokenValidation.ValidationEndpointTokenProvider.d__1.MoveNext()   在   System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start [TStateMachine](TStateMachine&安培;   stateMachine)at   IdentityServer3.AccessTokenValidation.ValidationEndpointTokenProvider.ReceiveAsync(AuthenticationTokenReceiveContext   上下文)   Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationHandler.d__0.MoveNext()

请参阅下面的答案了解详情。

2 个答案:

答案 0 :(得分:2)

文档展示了如何为令牌验证启用日志记录(在API项目中)

https://identityserver.github.io/Documentation/docsv2/consuming/diagnostics.html

答案 1 :(得分:1)

所以,在弄清楚实际错误之后,这完全是我的错。尽管阅读了非常清晰的文档和示例,但我为我的解决方案引用了错误的“IdentityModel”nuget包。

当我使用'old'.net时,我不应该使用IdentityModel2(即IdentiyModel nuget包的v2.0.0.0)。降级到v1.13已解决了这个问题,我的解决方案现在按预期工作。