收到 IDX10501 的错误信息:签名验证失败。使用 Azure AD 时无法匹配密钥
Posted
技术标签:
【中文标题】收到 IDX10501 的错误信息:签名验证失败。使用 Azure AD 时无法匹配密钥【英文标题】:Receiving the error message of IDX10501: Signature validation failed. Unable to match keys when using Azure AD 【发布时间】:2020-02-24 20:04:08 【问题描述】:请注意:此问题与this one 不重复,因此请不要将此问题标记为重复。
我搭建了一个 Web api 代码,该代码使用 Azure Active Directory 进行 Visual Studio 2019 的身份验证,并按照 this document 使用我的 Azure AD B2C 租户的配置条目来配置基本的搭建应用程序。
服务配置方法如下代码sn -p:
public void ConfigureServices(IServiceCollection services)
Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;
services
.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
配置文件包含以下 AzureAd 配置条目,我在其中屏蔽了实际 Id:
"AzureAd":
"Instance": "https://login.microsoftonline.com/",
"Domain": "testdirectoryv44.onmicrosoft.com",
"TenantId": "1234abcdef......,
"ClientId": "abcdef567....."
通过在 Azure 门户上运行用户流,我获得了一个令牌,并且能够通过 https://jwt.ms 解码该令牌,这很棒。但是,我在调用此 GET 请求时收到以下错误消息:https://localhost:44362/api/values
by POSTMAN,而它在发出请求时在标头中包含不记名令牌:(错误消息显示在 VS 2019 的输出窗格中)
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:信息: 验证令牌失败。
Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException: IDX10501:签名验证失败。无法匹配键:孩子: 'ABCDEF............',记号: '"typ":"JWT","alg":"RS256","kid":"ABCDEF........."."exp":1572358190,"nbf":1572354590," ver":"1.0","iss":"https://testdirectoryv44.b2clogin.com/abcdef1234556/v2.0/","sub":"8799abcdef0000","aud":"89000abcdecf999,"nonce":"defaultNonce","iat":1572354590,"auth_time": 1572354590,"idp_access_token":"BIGMASKEDVALUE","idp":"https://sts.windows.net/abcdef11234.../","name":"MyName","extension_InternalKey":"KEY400","given_name":"MyName","family_name":"MyFamily ","extension_InternalUserId":"guest","tfp":"B2C_1_testdirectoryv44"'。 在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(字符串 令牌,令牌验证参数验证参数)在 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(字符串 令牌、TokenValidationParameters 验证参数、SecurityToken& 验证令牌)在 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:信息: AzureADJwtBearer 未通过身份验证。失败消息:IDX10501: 签名验证失败。无法匹配键:孩子: '已删除'。 Microsoft.AspNetCore.Routing.EndpointMiddleware:信息:正在执行 端点'WebApplication5.Controllers.ValuesController.Get (WebApplication5)' Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息: 与 action = "Get", controller = "Values" 匹配的路由。执行 带有签名的控制器动作 Microsoft.AspNetCore.Mvc.ActionResult
1[System.Collections.Generic.IEnumerable
1[System.String]] 控制器 WebApplication5.Controllers.ValuesController 上的 Get() (WebApplication5)。 Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:信息: 授权失败。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息: 过滤器请求授权失败 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'。 Microsoft.AspNetCore.Mvc.ChallengeResult:信息:正在执行 ChallengeResult 与身份验证方案 ()。 Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:信息: AuthenticationScheme:AzureADJwtBearer 受到质疑。 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息: 执行的动作 WebApplication5.Controllers.ValuesController.Get (WebApplication5) 在 22.7988 毫秒内 Microsoft.AspNetCore.Routing.EndpointMiddleware:信息:已执行 端点'WebApplication5.Controllers.ValuesController.Get (WebApplication5)' Microsoft.AspNetCore.Hosting.Internal.WebHost:信息:请求 在 792.0596ms 401 完成
Web api 的代码很简单,如下代码 sn-p 由 Visual Studio 2019 搭建:
[Authorize]
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
return new string[] "value1", "value2" ;
// GET api/values/5
[HttpGet("id")]
public ActionResult<string> Get(int id)
return "value";
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
// For more information on protecting this API from Cross Site Request Forgery (CSRF) attacks, see https://go.microsoft.com/fwlink/?LinkID=717803
// PUT api/values/5
[HttpPut("id")]
public void Put(int id, [FromBody] string value)
// For more information on protecting this API from Cross Site Request Forgery (CSRF) attacks, see https://go.microsoft.com/fwlink/?LinkID=717803
// DELETE api/values/5
[HttpDelete("id")]
public void Delete(int id)
// For more information on protecting this API from Cross Site Request Forgery (CSRF) attacks, see https://go.microsoft.com/fwlink/?LinkID=717803
这几天我一直在花时间找出这次失败的根本原因,但到目前为止还没有成功。我在代码或 Azure AD 配置中遗漏了哪一点导致此问题以及为什么 https://jwt.ms 能够成功解码令牌?
【问题讨论】:
【参考方案1】:请注意,Azure AD 不同于 Azure AD B2C。
服务配置方法
public void ConfigureServices(IServiceCollection services)
services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
.AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
appsettings.json
"AzureAdB2C":
"Instance": "https://tony**test.b2clogin.com/tfp/",
"ClientId": "5eaf724c-a61e-***-a217-44ffd45f9dfe",
"Domain": "tony**test.onmicrosoft.com",
"SignUpSignInPolicyId": "B2C_1_testsignupin"
,
"Logging":
"LogLevel":
"Default": "Warning"
,
"AllowedHosts": "*"
你可以关注这个详细的tutorial。
【讨论】:
我希望 Microsoft 的 AD 文档团队能够更正确地记录所有步骤,包括您的答案。感谢您的帮助,@Tony Ju。 为什么要指定signupplicy?它肯定不会使用该策略来验证不记名令牌,以上是关于收到 IDX10501 的错误信息:签名验证失败。使用 Azure AD 时无法匹配密钥的主要内容,如果未能解决你的问题,请参考以下文章
Azure b2c 错误:IDX10501:签名验证失败。无法匹配键:孩子:'gLv****************'
IDX10501:签名验证失败。尝试的密钥:'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'
每日获取 :: SecurityTokenSignatureKeyNotFoundException: IDX10501: 签名验证失败。无法匹配键:
Azure AD - 为啥我无法验证 Azure AD 为我的 Web API 颁发的 JWT 令牌?收到“IDX10516:签名验证失败”错误