繁体   English   中英

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

[英]Asp.NET Core 3 - Azure Active Directory - Token Validation fails - Signature validation failed. Unable to match key

我们正在为我们公司使用 Azure Active Directory。 我们有一个带有 Asp.Net Core 3 的内部 web 项目。我们使用 React 作为前端。 用户可以使用他的 AAD 凭据登录,并且 React 应用程序会获得一个令牌。 Token 应该用于访问 ASP.Net Core 项目中的函数。 因此,应在 ASP.Net Core 中验证令牌。 这是我的问题。 我能够调用令牌验证,但我得到了不同的错误。

ASP.Net 应用程序: https://localhost:44350/

反应应用程序: https://localhost:44395/

这是 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;
}

正如你所看到的,我们尝试了不同的东西。 我们收到以下错误

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

当我们使用IssuerSigningKey = y, =>

Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException HResult=0x80131500 消息 = IDX10501:签名验证失败。 无法匹配键:孩子:'someId'。 捕获的异常:'System.NotSupportedException:IDX10634:无法创建 SignatureProvider。 算法:'RS256',SecurityKey:'Microsoft.IdentityModel.Tokens.SymmetricSecurityKey,KeyId:'',InternalId:''。 不支持

当我们使用IssuerSigningKey = signingKey, =>

Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundException HResult=0x80131500 消息 = IDX10501:签名验证失败。 无法匹配键:孩子:'someId'。 捕获的异常:''。

我不知道如何配置 TokenValidationParameters。 当我查看https://login.microsoftonline.com/{tenant}/discovery/v2.0/keys 时,我看到了异常中说明的密钥。 但是有很多信息。

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

我们怎样才能使验证工作?

提前致谢

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

作为一些旁注:

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

这是一个 SPA 应用程序吗? 如果是,则此示例应该很有用:

https://github.com/Azure-Samples/ms-identity-javascript-react-spa-dotnetcore-webapi-obo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM