当前位置: 首页 > 知识库问答 >
问题:

收到IDX10501的错误消息:签名验证失败。使用Azure AD时无法匹配密钥

董鸣
2023-03-14

请注意:此问题与此问题不同,因此请不要将此问题标记为重复。

我搭建了一个web api代码,它使用Azure Active Directory通过Visual Studio 2019进行身份验证,并遵循此文档,通过使用我的Azure AD B2C租户的配置条目来配置基本的搭建应用程序。

服务配置方法类似于以下代码片段:

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门户上运行userflow,我获得了一个令牌,并能够通过https://jwt.ms这很好。但是,调用此GET请求时,我收到以下错误消息:<code>https://localhost:44362/api/values由邮递员在发送请求时将承载令牌包含在标题中:(错误消息显示在VS 2019的输出窗格中)

微软。AspNetCore . authentic ation . jwtbearer . jwtbearerhandler:信息:无法验证令牌。

Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotundException: 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“:”默认农牌“,”iat“:1572354590”,“auth_time”:1572354590,“idp_access_token”:“大面具”,idp“:”https://sts.windows.net/abcdef11234.../“,”名称“:”MyName“,”extension_InternalKey“:”KEY400“,”given_name“:”MyName“,”family_name“:”MyFamily“,”extension_InternalUserId“:”客人 tfp“:”B2C_1_testdirectoryv44“}'.at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(字符串令牌, TokenValidationParameters 验证参数) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(字符串令牌, TokenValidationParameters 验证参数验证参数, SecurityToken

Web api 的代码与以下代码片段一样简单,该代码片段由 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个答案

壤驷德寿
2023-03-14

请注意,Azure广告与Azure广告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": "*"
}

可以按照这个详细教程来。

 类似资料:
  • 当我重新启动identityserver4客户端应用程序第一次获得异常时,我使用identityserver4处理SSO问题 因此,我将更改为但在重新启动identityserver时仍然会出现错误

  • 这是ASP操作之一: 传递令牌并触发验证。验证在Validate方法中: 如你所见,我们尝试了不同的方法。我们在行中出现了以下错误 提前致谢

  • 请帮忙。我有一个 SP,以及一个用于远程 IDP 的公钥。我上传了 spring sam 的示例,并对其进行了更改,公钥被添加到带有别名的 jks 文件中(使用键工具,命令列表显示 cer 已导入),并且它指向带有签名键的 idp 扩展元数据。但最终验证失败了。 org.opensaml.ws.security.安全策略异常:协议消息签名验证失败

  • 我试图使用javascript创建ECDSA算法的密钥对,签名消息,然后在服务器端验证它(使用Java)。 示例javascript代码: 例如: 我做错了什么?

  • 问题内容: 大家好 这是我的要求信息: 我尝试验证与body标签相关的。有像和这样的标签,这对我来说真的很混乱。我的问题是如何验证身体部位?首先,我应该获得什么标签来开始验证 要不就 ??? 我必须执行哪些操作(规范化/转换/加密)??? 任何帮助表示赞赏。提前致谢。 问题答案: 解决方案是: 哪里 并向X509KeySelector提供验证签名所需的公钥。

  • 我有一个简单的登录模型类,几乎没有数据注释验证 View是一个部分View,如下所示: 我相信我已经做了验证消息显示所需的所有事情,但它没有,客户端验证也没有。在母版页的头部区域,我还包括了以下脚本 是什么导致了这个问题?解决办法是什么?