JwtBearer TokenValidationParameters 似乎没有经过测试

JwtBearer TokenValidationParameters don't seem to be Tested

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

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

有人建议我在 ASP.Net Core API Startup.cs 中配置以下内容,并且我添加了对令牌 header(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' 无效”),因此我对这些设置有一定的信心正在阅读并在一定程度上应用。但是,如果我将 correct 预期的 header 类型(“at+jwt”)或我的 key/secret 值更改为 不正确的值,没有错误结果,并且 API 继续 returns 结果调用它。我还尝试添加许多 TokenValidationParameter 设置,例如 ValidateIssuer 和 ValidIssuer 也不会在不匹配时触发错误。

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

我相信我已经找到了对触发此问题的 'ValidTypes' 值测试的相当确定的答案。答案在updated IDS4 docs里找到了,里面有评论:

"On .NET Core 3.1 you need to manually reference the System.IdentityModel.Tokens.Jwt Nuget package version 5.6 to be able to check the type header."

果然,这是一个 .Net Core 3.1 项目,在安装 System.IdentityModel.Tokens.Jwt 包(目前为 v6.8.0)后,当我放置 'bad' 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 的散列以使用非对称密钥。因此,我推测中间件的某些部分忽略了我设置的 symmetric 密钥,因为它确定令牌上使用了不同类型的算法?