Identity Server 4 发出 JWT 验证失败

Identity Server 4 issued JWT Validation failure

我有一个基于 IdentityServer 4 (.Net Core v2) 的 Identity Server 运行 针对完整的 .Net 框架,我有一个 ASP.NET WebAPI 针对 ASP.Net Web API 2(即不是 .Net Core)正在使用 Identity Server 3 OWIN 中间件进行令牌身份验证。

当 运行 在本地时,一切正常 - 我可以使用 Postman 使用 RO 密码流从身份服务器请求访问令牌,然后我可以向 Web 发出请求API 将令牌作为 Bearer 令牌发送 - 一切正常。

现在,当一切都托管在我们的测试服务器上时,我在调用 Web 时遇到问题API - 我只是收到未经授权的响应。从身份服务器返回的令牌正常(使用 http://jwt.io 检查),但 JWT 在 WebAPI 中的验证失败。 在进一步调查中,在添加 Katana 日志记录后,我发现报告了 SecurityTokenInvalidAudienceException。

Audience validation failed. Audiences: 'https://11.22.33.44:1234/resources, XXXWebApi'. Did not match: validationParameters.ValidAudience: 'https://localhost:1234/resources' or 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 以包含 XXXWebApi,这足以匹配 JWT 受众,但似乎被忽略了。

我不确定要在 WebAPI 身份验证选项中更改什么才能使这项工作正常进行。

编辑:我更改了 WebAPI 令牌身份验证选项以使用验证端点,这在 IdentityServer 中也失败并出现相同的错误。 如果我使用相同的令牌直接从 Postman 调用 Identity Server 自省端点,它会成功。

据我了解,您的 WebAPI 项目用作 API 资源。

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

当您使用参考令牌时,您需要它们。从你所说的 - 你正在使用 JWT 一个。检查 here, here and here.

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

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

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

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