您不需要设置TokenValidationParameters
。如果正确设置了Authority
(即颁发令牌的身份验证服务器的地址),则JWT承载中间件将使用此URI查找和检索可用于验证令牌签名的公共密钥。它还将确认令牌中的iss
参数与此URI匹配。中间件将帮助从OIDC元数据中获取密钥并缓存密钥。
TokenValidationParameters
可以用于您想要在不访问发行服务器的情况下验证令牌的情况。相反,您想使用本地已经存在的公钥来验证传入令牌。然后,您将无法设置Authority
,设置ValidateIssuerSigningKey
和ValidateIssuer
并最终设置{{1 }},它是用于验证传入的JWT令牌的公钥。
,
查看AddJwtBearer
的源代码,并根据我的实验,Authority
只是您需要分配的属性。在这种情况下,处理程序将使用
MetadataAddress = $"{Authority}/.well-known/openid-configuration";
解析您的领域的元数据URL并从那里下载签名密钥。
,
我想知道的是-研究/调试显示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);
}
很明显,只有在配置中设置Oauth权限时,才会调用此联系公钥授权的逻辑:
.AddJwtBearer(o =>{
o.Authority = "https://authorityUri/";
})
AddJwtBearer中间件处理程序将在内部向“ o.Authority”添加“ .well-known / openid-configuration”字符串,并尝试获取包含授权服务器详细信息的JSON。 (Google示例:https://accounts.google.com/.well-known/openid-configuration)。
下一步-获取jwks_uri
(如果使用Google https://www.googleapis.com/oauth2/v3/certs)并获取jwks文件,该文件将具有用于签名验证的数据(publicKey,算法,初始向量)。 >
所有这些步骤之后,JwtBearer验证令牌签名。
仅供参考-如果您使用自己的“签名密钥”颁发者来配置令牌,JwtBearer可以未经授权地验证令牌,如下所示:
.AddJwtBearer(o =>{
o.TokenValidationParameters.IssuerSigningKey = GetKey();
//in this case you need to provide valid audience or disable validation
o.TokenValidationParameters.ValidateAudience = false
//in this case you need to provide valid issuer or disable validation
o.TokenValidationParameters.ValidateIssuer= false
})
Microsoft.IdentityModel.Tokens.SecurityKey = GetKey(){
var key = "Secret_Pass";
return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key));
}
在这种情况下,您需要提供发行者和受众或禁用验证。
当您没有Oauth服务器并使用共享密钥自己发行令牌时,此配置可用于B2B情况-服务器到服务器的通信。
要全面了解此配置-权限和发行者密钥集:
.AddJwtBearer(o =>{
o.Authority = "https://authorityUri/";
o.TokenValidationParameters.IssuerSigningKey = GetKey();
})
在这种情况下,不会触摸权限,并且将使用本地生成的密钥来验证令牌,因此优先级为TokenValidationParameters.IssuerSigningKey。意味着没有理由添加权限。
,
您可以参考https://zhiliaxu.github.io/how-do-aspnet-core-services-validate-jwt-signature-signed-by-aad.html#configuration来了解AddJwtBearer()
如何从.well-known/openid-configuration
获取非对称签名密钥。
本文链接:https://www.f2er.com/3141143.html