我在我的开发环境中设置了一个简单的身份服务器,配置如下:
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:2016-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()
请参阅下面的答案了解详情。
答案 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已解决了这个问题,我的解决方案现在按预期工作。