收到 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.ActionResult1[System.Collections.Generic.IEnumerable1[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:签名验证失败。无法匹配键

IDX10501:签名验证失败。无法匹配密钥

IDX10501:签名验证失败。尝试的密钥:'System.IdentityModel.Tokens.X509AsymmetricSecurityKey'

每日获取 :: SecurityTokenSignatureKeyNotFoundException: IDX10501: 签名验证失败。无法匹配键:

Azure AD - 为啥我无法验证 Azure AD 为我的 Web API 颁发的 JWT 令牌?收到“IDX10516:签名验证失败”错误