Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException:'IDX10503:签名验证失败。托肯没有孩子。尝试的键:“[‘System.Text.StringBuilder’类型的 PII 已隐藏。有关更多详细信息,请参阅 https://aka.ms/IdentityModel/PII。]'。 TokenValidationParameters 中的键数:'1'。
配置中的按键数量:“0”。
捕获异常:
'[“System.Text.StringBuilder”类型的 PII 已隐藏。有关更多详细信息,请参阅 https://aka.ms/IdentityModel/PII。]'。
token:“[‘System.IdentityModel.Tokens.Jwt.JwtSecurityToken’类型的 PII”已隐藏。有关更多详细信息,请参阅 https://aka.ms/IdentityModel/PII。]'。有关详细信息,请参阅 https://aka.ms/IDX10503。'
这是我遇到的例外;我想验证令牌而不在标题或声明中给出
kid
。
这可以吗?
“kid”用于从从发行者元数据端点获取的密钥列表中解析 IssuerSigningKey。比如下面这样:
.AddMicrosoftIdentityWebApp(options =>
{
builder.Configuration.Bind("AzureAd", options);
options.TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKeyResolver = (token, securityToken, kid, validationParameters) =>
{
// Custom logic to resolve the signing key
var keys = GetKeysFromMetadataEndpoint(validationParameters.ValidIssuer);
var key = keys.FirstOrDefault(k => k.KeyId == kid);
return new List<SecurityKey> { key };
}
};
IEnumerable<SecurityKey> GetKeysFromMetadataEndpoint(string issuer)
{
// Fetch keys from the issuer's metadata endpoint
// For example, use HttpClient to get the JWKS and parse it
return new List<SecurityKey>();
}
所以只有你自己能返回正确的“钥匙”,这个孩子才能被跳过。
跳过孩子的一个简单方法是禁用“IssuerSigningKey”验证。但您应该考虑安全影响。
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = false
}