我有一个基于IdentityServer 4(.Net Core v2)运行的Identity Server,目标是完整的.Net框架,我有一个针对ASP.Net Web API 2(即非.Net Core)构建的ASP.NET WebAPI正在使用Identity Server 3 OWIN中间件进行令牌身份验证。
在本地运行时,一切正常 - 我可以使用Postman使用RO密码流从Identity Server请求访问令牌,然后我可以向WebAPI发出请求,将令牌作为承载令牌发送 - 所有工作正常。
现在,当我们的测试服务器上托管所有内容时,我在调用WebAPI时遇到问题 - 我只是得到一个未经授权的响应。从Identity服务器返回的令牌是可以的(使用http://jwt.io检查),但是在WebAPI中JWT的验证失败。 在进一步调查后,在添加Katana日志记录后,我看到正在报告SecurityTokenInvalidAudienceException。
受众群体验证失败。观众: ' https://11.22.33.44:1234/resources,XXXWebApi'。不匹配: validationParameters.ValidAudience:' https://localhost:1234/resources' 或validationParameters.ValidAudiences:' null'
观察JWT观众,我们有:
aud:" https://11.22.33.44:1234/resources"," XXXWebApi"
在WebAPI初创公司中,我接到了
的电话app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = , // path to our local ID Server
ClientId = "XXXWebApi",
ClientSecret = "XXX_xxx-xxx-xxx-xxx",
RequiredScopes = new[] { "XXXWebApi" }
});
所以JWT观众看起来还不错,但它显然与中间件(从IdP发现终点构建)提供的内容不匹配。我原以为是因为我指定的RequiredScopes包含了足以匹配JWT受众的XXXWebApi,但这似乎被忽略了。
我不确定在WebAPI身份验证选项中要更改哪些内容才能使其正常工作。
编辑:我更改了WebAPI令牌身份验证选项以使用验证端点,这在IdentityServer中也会因同样的错误而失败。 如果我使用相同的令牌直接从Postman调用Identity Server内省端点,则会成功。
答案 0 :(得分:0)
好的,所以经过大量的努力和尝试各种各样的事情后,我至少有一些工作。
我必须确保Identity Server是针对公共DNS托管的,并在IdentityServerBearerTokenAuthenticationOptions中配置Authority值以使用相同的值。
这样,发布的任何令牌在JWT受众(aud)中都有xx.yy.zz完整域名,当WebAPI中的OWIN验证中间件验证JWT时,它使用相同的地址进行比较而不是localhost。
我仍然有点困惑为什么中间件只能使用范围值进行验证,因为令牌是在受众中使用API资源范围(XXXWebAPi)发出的,并且API在请求中使用相同的范围ID /名称。选项如图所示。
答案 1 :(得分:-1)