Identity Server 4发出JWT验证失败

时间:2018-02-13 11:49:06

标签: jwt identityserver4 identityserver3 owin-middleware

我有一个基于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内省端点,则会成功。

2 个答案:

答案 0 :(得分:0)

好的,所以经过大量的努力和尝试各种各样的事情后,我至少有一些工作。

我必须确保Identity Server是针对公共DNS托管的,并在IdentityServerBearerTokenAuthenticationOptions中配置Authority值以使用相同的值。

这样,发布的任何令牌在JWT受众(aud)中都有xx.yy.zz完整域名,当WebAPI中的OWIN验证中间件验证JWT时,它使用相同的地址进行比较而不是localhost。

我仍然有点困惑为什么中间件只能使用范围值进行验证,因为令牌是在受众中使用API​​资源范围(XXXWebAPi)发出的,并且API在请求中使用相同的范围ID /名称。选项如图所示。

答案 1 :(得分:-1)

据我所知,您的WebAPI项目被用作API资源。

如果是这样 - 从UseIdentityServerBearerTokenAuthentication删除'clientId'和'clientSecret',保留'RequiredScopes'和权限(您可能还需要设置ValidationMode = ValidationMode.Both)。

当您使用引用令牌时,您需要它们。从你所说的 - 你正在使用JWT。查看hereherehere