chr*_*ark 15 keycloak .net-core asp.net-core
我试图确定为 .Net Core 3.0 提供的 JwtBearer 服务是否实际上使用了我的 oidc 提供商众所周知的配置提供的非对称签名密钥?
我找不到与此相关的任何文档。
.AddJwtBearer(opt =>
{
opt.Authority = "http://localhost:8180/auth/realms/master";
opt.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true
};
Run Code Online (Sandbox Code Playgroud)
我使用 Keycloak 4.8.3 作为我的 oidc 提供程序。我能找到的最接近的文档在这里。https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide
相关部分在这里:
如果您让 JwtBearer 中间件通过发现文档自动配置,这一切都会自动运行!
上面的代码完成了所有这些吗?由于我们不再注册中间件,这在 3.0 中仍然相关吗?
我敢打赌很多人不了解非对称签名密钥,也不知道它们为何如此重要。我们已经从开发人员那里抽象了太多东西,现在我什至不知道我的 api 是否安全。
所以最后的问题是:
具有“ValidateIssuerSigningKey”的 .AddJwtBearer 服务是否定期检查众所周知的或任何发现文档以获取最新的非对称签名密钥?
Vit*_*nov 19
我也想知道 - 研究/调试表明 JwtBearer 确实试图联系权威机构来获取公钥。
这是验证期间调用的函数:
// System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.cs
protected virtual SecurityKey ResolveIssuerSigningKey(string token, JwtSecurityToken jwtToken, TokenValidationParameters validationParameters)
{
if (validationParameters == null)
throw LogHelper.LogArgumentNullException(nameof(validationParameters));
if (jwtToken == null)
throw LogHelper.LogArgumentNullException(nameof(jwtToken));
return JwtTokenUtilities.FindKeyMatch(jwtToken.Header.Kid, jwtToken.Header.X5t, validationParameters.IssuerSigningKey, validationParameters.IssuerSigningKeys);
}
Run Code Online (Sandbox Code Playgroud)
显然,仅当您在配置中设置 Oauth 权限时,才会调用联系公钥权限的逻辑:
.AddJwtBearer(opt => {
opt.Authority = "https://authorityUri/";
});
Run Code Online (Sandbox Code Playgroud)
AddJwtBearer 中间件处理程序在内部会将“.well-known/openid-configuration”字符串添加到 o.Authority 中,并尝试获取包含授权服务器详细信息的 JSON。(谷歌示例:https://accounts.google.com/.well-known/openid-configuration)。
下一步 - get jwks_uri
,(如果是 google https://www.googleapis.com/oauth2/v3/certs)并获取 jwks 文件,该文件将包含用于签名验证的数据(公钥、算法、初始向量)。
完成所有这些步骤后,JwtBearer 验证令牌签名。
仅供参考 - 如果您使用自己的签名密钥颁发者配置 JwtBearer,则 JwtBearer 可以在没有权限的情况下验证令牌,如下所示:
.AddJwtBearer(opt => {
opt.TokenValidationParameters.IssuerSigningKey = GetKey();
//in this case you need to provide valid audience or disable validation
opt.TokenValidationParameters.ValidateAudience = false
//in this case you need to provide valid issuer or disable validation
opt.TokenValidationParameters.ValidateIssuer= false
})
Microsoft.IdentityModel.Tokens.SecurityKey = GetKey() {
string key = "Secret_Pass";
return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您需要提供发行者和受众或禁用验证。此配置可用于 B2B 情况 - 服务器到服务器通信 - 当您没有 Oauth 服务器并使用共享密钥自行颁发令牌时。
要了解完整情况,请查看此配置 - 权限和颁发者密钥集:
.AddJwtBearer(opt => {
opt.Authority = "https://authorityUri/";
opt.TokenValidationParameters.IssuerSigningKey = GetKey();
});
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不会触及权限,并且您本地生成的密钥将用于验证令牌,因此优先级是 TokenValidationParameters.IssuerSigningKey。意味着没有理由添加权限。
你不需要设置TokenValidationParameters
。如果Authority
正确设置了令牌颁发身份验证服务器的地址,JWT 承载中间件将使用此 URI 查找并检索可用于验证令牌\xe2\x80\x99s 签名的公钥。它还将确认iss
令牌中的参数与此 URI 匹配。中间件将帮助从 OIDC 元数据获取密钥并缓存密钥。
TokenValidationParameters
可以在您想要验证令牌而无需访问发行服务器的情况下使用。相反,您希望使用本地已存在的公钥来验证传入的令牌。然后您无法设置Authority
、 设置ValidateIssuerSigningKey
和ValidateIssuer
,最后设置IssuerSigningKey
哪个是用于验证传入的 JWT 令牌的公钥。
归档时间: |
|
查看次数: |
13065 次 |
最近记录: |