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

ASP.NET Core 3-Azure Active Directory-令牌验证失败-签名验证失败。无法匹配密钥

柳高卓
2023-03-14

这是ASP操作之一:

[HttpGet]
[Route("GetArticles")]
public async Task<JsonResult> GetArticles()
{
    if (!Request.Headers.TryGetValue("Authorization", out var authorizationToken))
    {
        return Json(Unauthorized());
    }

    if (!authorizationToken.Any())
    {
        return Json(Unauthorized());
    }
    
    var jwt = await Validate(authorizationToken.First());

    return Json(await _unitOfWork.ArticlesRepos.GetAllAsync());
}

传递令牌并触发验证。验证在Validate方法中:

public async Task<JwtSecurityToken> Validate(string token)
{
    string tenant = _configuration.GetValue<string>("Tenant");
    string publicKey = _configuration.GetValue<string>("AadPubKey");
    //string stsDiscoveryEndpoint = $"https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
    //string stsDiscoveryEndpoint = $"https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token";
    string stsDiscoveryEndpoint = $"https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration";
    
    ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());

    OpenIdConnectConfiguration config = await configManager.GetConfigurationAsync();
    var IssuerSigningKeys = config.SigningKeys;

    var x = new X509Certificate2(Encoding.ASCII.GetBytes(publicKey));
    var y = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(publicKey));
    var rsa = new RSACryptoServiceProvider();
    string exponentvalue = "AQAB";
    var e = Base64UrlEncoder.DecodeBytes(exponentvalue);
    var N = publicKey;
    var modulus = Base64UrlEncoder.DecodeBytes(N);
    rsa.ImportParameters(
        new RSAParameters()
        {
                Modulus = modulus,
                Exponent = e
    });
    var signingKey = new RsaSecurityKey(rsa);

    TokenValidationParameters validationParameters = new TokenValidationParameters
    {
        ValidateAudience = false,
        ValidateIssuer = true,
        ValidIssuer = stsDiscoveryEndpoint,
        //ValidIssuer = "https://localhost:44350/",
        //ValidAudience = "https://localhost:44395/",
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = signingKey,
        ValidateLifetime = false
    };

    JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler();

    var result = tokendHandler.ValidateToken(token, validationParameters, out SecurityToken jwt);

    return jwt as JwtSecurityToken;
}

如你所见,我们尝试了不同的方法。我们在行中出现了以下错误

{"keys":
[{"kty":"RSA"
,"use":"sig"
,"kid":"someId"
,"x5t":"someId"
,"n":"longString"
,"e":"AQAB"
,"x5c":["otherLongString"]
,"issuer":"https://login.microsoftonline.com/myTenant/v2.0"},
{...},{...}]

提前致谢

共有1个答案

钱朝明
2023-03-14

使用SymmetricSecurityKey从RS256算法获取IDX10634错误看起来像是在较新版本的IdentityModel中已修复的行为。您使用的是哪个版本的IdentityModel程序集?请尝试更新到最新版本(当前为6.7.1),看看您的问题是否仍然存在。

作为一些附带说明:

JwtSecurityTokenHandler/TokenValidationParameters是长期生存的对象。例如,TokenValidationParameters有一个缓存,可在重用时加以利用。

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

  • 问题内容: 我正在努力验证Azure AD令牌签名。 当我在下面的“ jwks_uri”字段中查找正确的键描述时 https://login.microsoftonline.com/common/.well-known/openid- configuration 我检查所属密钥数据。 我尝试使用“ n”-模数和“ e”字段生成用于签名验证的公钥,但最终出现错误: 安慰: 我尝试了另一种使用“ x5

  • 我会在我的Angular Web应用程序中使用Microsoft Graph API。 首先,我使用msal库进行连接 当我尝试使用我的profil登录时,我收到此错误 我已将我的应用程序配置为官方git示例中提到的应用程序 认证有效,我得到了令牌。 然后,当我在主页时,我向微软图形API发出第二个请求,以使用该令牌获取用户信息。 } 我得到一个401未经授权的错误,并回复: 我不知道为什么MG

  • 我在Tomcat 7上使用Spring Security SAML 2.0示例webapp,并对其进行了修改,以尝试让其通过Ping身份验证服务。webapp正在与服务对话,并返回一个断言,但在尝试验证签名时失败,如下调试输出所示: 我知道它无法验证签名,并且我已经获得了ping身份管理员要使用的证书,但我不确定如何将其包含在应用程序中。我尝试过使用JDK的keytools程序将其添加到示例应用程

  • 我有一个电子签名/数字签名的PDF,该文档在分离签名中使用iText lib进行签名。我在验证签名时遇到问题,收到消息“签名者身份无效,因为它已过期或尚未有效”,并且在签名者信息中“构建从签名者证书到颁发者证书的路径时出错。” 我尝试了很多方法来验证签名,但都没有成功。如果我明确地将签名者证书添加为可信证书,那么我会得到一个绿色检查,并能够验证签名,但我认为这不是正确的方法。 数字签名的pdf可以

  • 我试图使用Terraform创建一个自签名证书,以便在测试/开发环境中内部使用。 我首先创建一个CA私钥,自签名证书。 然后,为要启用HTTPS的内部域名创建证书签名请求和私钥。 然后我在证书上签字。以下是我使用的整个Terraform清单: 我查了Terraform舱单。然后我从状态文件中提取生成的证书并将它们保存到文件中。 我试图用openssl验证最终证书,但得到一个错误: 你知道问题出在哪