c# - 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,而不会在不匹配时触发错误。
我错过了什么可能会阻止这些项目被正确测试?
解决方案
我相信我已经为触发这个问题的“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 的散列以使用非对称密钥。因此,我推测中间件的某些部分忽略了我设置的对称密钥,因为它确定令牌上使用了不同类型的算法?
推荐阅读
- angular - DOMException:无法在“WorkerGlobalScope”上执行“importScripts”:“http://localhost:4200/BlinkCardWasmSDK.js”处的脚本无法加载
- python - Python OCR 文本图像自动检测角度倾斜/旋转
- ios - UIImagePickerController 相机:如何使用全屏?(底部的黑色子视图)
- python - 在 python 脚本中运行两个 asynco 循环(telethon,aiopg)
- java - 使用带有特定用例的 Spring Security 获取访问令牌
- java - 在 gradle 中创建胖 jar 时遇到问题 - 使用 Eclipse IDE、Kryonet 和 LibGDX
- octave - 在 Octave 中求解多个值的方程
- html - 如何使用 :not() 选择器选择表?
- react-native - Expo usePermissions 使用多个权限时无限循环(数组格式)
- php - 为什么从控制器调用时应用程序未定义?