代码之家  ›  专栏  ›  技术社区  ›  Mark Bennetts

Identity Server 4发布的JWT验证失败

  •  2
  • Mark Bennetts  · 技术社区  · 8 年前

    我有一个基于IdentityServer 4(.Net Core v2)的Identity Server,目标是完整的。Net框架,我有一个ASP。NET WebAPI构建于ASP。Net Web API 2(即非.Net Core),它使用Identity Server 3 OWIN中间件进行令牌身份验证。

    在本地运行时,一切正常-我可以使用Postman使用RO密码流从Identity Server请求访问令牌,然后我可以向WebAPI发出请求,将令牌作为承载令牌发送-一切正常。

    现在,当所有内容都托管在我们的测试服务器上时,我在调用WebAPI时遇到了一个问题——我只是得到了一个未经授权的响应。从Identity server返回的令牌正常(使用 http://jwt.io ),但WebAPI中的JWT验证失败。 在进一步的调查中,在添加Katana日志之后,我看到报告了SecurityTokenInvalidAudienceException。

    访问群体验证失败。受众: ' https://11.22.33.44:1234/resources ,XXXWebApi'。不匹配: validationParameters。有效期:' https://localhost:1234/resources ' 或validationParameters。有效期:“null”

    看看JWT的观众,我们有:

    澳元:“ 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发现端点构建)提供的内容不匹配。我会这样想,因为我指定了所需的范围来包括XXXWebApi,这足以匹配JWTs受众,但似乎被忽略了。

    我不确定如何更改WebAPI身份验证选项来实现这一点。

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

    2 回复  |  直到 8 年前
        1
  •  0
  •   Mark Bennetts    8 年前

    好吧,在做了很多努力之后,我至少有了一些工作。

    我必须确保Identity Server是根据公开可用的DNS托管的,并在IdentityServerBealerTokenauthenticationOptions中配置权限值以使用相同的值。

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

    我仍然有点困惑,为什么中间件不能只使用范围值进行验证,因为令牌是在访问群体中与API资源范围(XXXWebAPi)一起发布的,并且API在选项中请求相同的范围id/名称,如图所示。

        2
  •  -1
  •   m3n7alsnak3    8 年前

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

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

    当您使用引用标记时,您需要它们。根据您所说的,您正在使用JWT。检查 here , here here .