首页 > 解决方案 > JwtBearer TokenValidationParameters 似乎没有经过测试

问题描述

这个问题与 .Net Core API 项目上的 JwtBearer 令牌配置有关。

最近我的一位同事将 Identity Server 4 更新为 v4,因此,提供令牌的方式发生了一些重大变化,最重要的是删除了aud令牌中的 (audience) 元素(参考:IDS4 文档)。

有人建议我在 ASP.Net Core API Startup.cs 中配置以下内容,并添加了对令牌标头(ValidTypes 检查)和密钥的额外检查,这些检查已通过先前使用的“ .AddIdentityServerAuthentication(options => ...)”配置进行了测试。

services.AddAuthentication(
        options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }
    )
    .AddJwtBearer("Bearer",
        options =>
        {
            options.Authority = "https://<<my_identity_server.com>>";
            options.RequireHttpsMetadata = true;

            options.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateAudience = false,
                
                ValidTypes = new[] { "at+jwt" },
                
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("<<key/secret>>")),
            };
        });

如果没有这些 TokenValidationParameters 设置,尤其是 ' ValidateAudience = false',我会收到与空受众相关的错误(“受众 'empty' 无效”),因此我有信心在一定程度上读取和应用这些设置。但是,如果我将正确的预期标头类型 ("at+jwt") 或我的密钥/秘密值更改为不正确的值,则不会导致错误,并且 API 会继续返回结果调用。我还尝试添加许多 TokenValidationParameter 设置,例如 ValidateIssuer 和 ValidIssuer,而不会在不匹配时触发错误。

我错过了什么可能会阻止这些项目被正确测试?

标签: c#asp.net-corejwtidentityserver4bearer-token

解决方案


我相信我已经为触发这个问题的“ValidTypes”值的测试找到了一个相当确凿的答案。答案在更新的 IDS4 文档中找到,其中有一条评论:

“在 .NET Core 3.1 上,您需要手动引用 System.IdentityModel.Tokens.Jwt Nuget 包 5.6 版才能检查类型标头。”

果然,这是一个 .Net Core 3.1 项目,在安装 System.IdentityModel.Tokens.Jwt 包(当前为 v6.8.0)后,当我在TokenValidationParameters,然后本地日志显示错误如:

info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[7] Bearer was not authenticated. Failure message: IDX10257: Token type validation failed. Type: 'at+jwt'. Did not match: validationParameters.TokenTypes: '*****NOT_MY_JWT_HEADER_TYP*****'.

将预期的 ValidTypes 更正为ValidTypes = new[] { "at+jwt" }现在可以正常工作。

我真的很困惑一个人是如何用中间件来发现这样的东西的。并不是我没有正确版本的软件包……我根本没有安装软件包!我觉得很混乱。

我在问题中还提到,我试图通过对对称密钥值设置不好的期望来强制失败......但我的 api 调用没有失败。我对此不太确定,但事实证明我的同事已决定更改 JWT 的散列以使用非对称密钥。因此,我推测中间件的某些部分忽略了我设置的对称密钥,因为它确定令牌上使用了不同类型的算法?


推荐阅读