请帮忙!我在使用Microsoft的System.IdentityModel.Tokens.Jwt库验证用RS256签名的JWT令牌时遇到问题。
这是错误:
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException IDX10503:签名验证失败。尝试过的键:“ [PII隐藏]”。捕获到异常:“ [PII隐藏]”。令牌:“ [PII隐藏]”。
这是示例代码(我将LinqPad与System.IdentityModel.Tokens.Jwt v5.2.2 NuGet包一起使用):
void Main()
{
var cText =
"-----BEGIN CERTIFICATE-----\n" +
"MIIBljCCAUACCQCIDMpqK7WfWDANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJV\n" +
"UzETMBEGA1UECAwKU29tZS1TdGF0ZTESMBAGA1UECgwJTHV4b3R0aWNhMRowGAYD\n" +
"VQQLDBFMdXhvdHRpY2EgZXllY2FyZTAeFw0xODA1MjMxNTE1MjdaFw0yODA1MjAx\n" +
"NTE1MjdaMFIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMRIwEAYD\n" +
"VQQKDAlMdXhvdHRpY2ExGjAYBgNVBAsMEUx1eG90dGljYSBleWVjYXJlMFwwDQYJ\n" +
"KoZIhvcNAQEBBQADSwAwSAJBAKuMYcirPj81WBtMituJJenF0CG/HYLcAUOtWKl1\n" +
"HchC0dM8VRRBI/HV+nZcweXzpjhX8ySa9s7kJneP0cuJiU8CAwEAATANBgkqhkiG\n" +
"9w0BAQsFAANBAKEM8wQwlqKgkfqnNFcbsZM0RUxS+eWR9LvycGuMN7aL9M6GOmfp\n" +
"QmF4MH4uvkaiZenqCkhDkyi4Cy81tz453tQ=\n" +
"-----END CERTIFICATE-----";
var c = new X509Certificate2(Encoding.ASCII.GetBytes(cText));
var p = new TokenValidationParameters();
p.IssuerSigningKeyResolver = (s, securityToken, identifier, parameters)
=> new[] { new X509SecurityKey(c) };
var h = new JwtSecurityTokenHandler();
var token = @"eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJuLmNoaWVmZm8iLCJleHAiOjE1MjcyMzg4ODEsImlzcyI6Imx1eCJ9.BAaYzLwokmdKqLi6zKjGIpDXd__dZxi5PUWWHS3PSLPDYAInzPbEK8o4WxunoGD7eA0qtQNaxNpzeOc3BHrd4w";
h.ValidateToken(token, p, out …Run Code Online (Sandbox Code Playgroud) 我很难尝试使用Azure AD B2C来验证My Web API.我将从一些背景开始
我创建了使用Azure AD B2C对用户进行身份验证的移动应用程序.我正在创建一个显示此URL的WebView:

用户被要求登录azure广告,如果登录数据成功,我收到包含访问令牌的响应 - 这部分顺利进行,一切正常.
现在我想创建后端Web Api.我创建了ASP NET Core Web应用程序,它允许我选择身份验证方法.我选择Azure AD身份验证,以便模板为我生成所有必需的数据.代码中的相关部分在这里:

我更新了所有必需的配置属性以匹配我的azure设置.此时我希望能够使用我在移动应用程序上收到的访问令牌来调用API.我在本地运行移动应用程序,登录,接收访问令牌,复制它并尝试使用邮递员(带有授权标题"Bearer ...")来调用我的web api(在IIS express中托管).不幸的是没有运气 - 我收到401以下标题:
Bearer error ="invalid_token",error_description ="找不到签名密钥"
我认为令牌足以授权API - 我理解这是OAuth的一个重点.我错过了什么吗?我应该有一些额外的配置吗?我注意到配置缺少登录策略(这似乎是AD B2C名称所要求的,所以我尝试添加:
var validationParameters = new TokenValidationParameters
{
AuthenticationType = "MY_POLICY",
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
Audience = Configuration["Authentication:AzureAd:Audience"],
TokenValidationParameters = validationParameters
});
Run Code Online (Sandbox Code Playgroud)
但这也行不通.将不胜感激任何帮助.
编辑
我在Visual Studio日志中发现以下错误:
持票人未经过认证.失败消息:IDX10501:签名验证失败.无法匹配'kid':'...'