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



我们公司正在使用Azure Active Directory。我们有一个内部的网络项目与Asp.Net核心3。我们使用React作为前端。用户可以使用他的AAD凭据登录,React应用程序将获得一个令牌。令牌应用于访问ASP.Net Core项目中的功能。因此,令牌应该在ASP.Net Core中进行验证。这是我的问题。我可以调用令牌验证,但我遇到了不同的错误。

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

react应用程序: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());
}

令牌通过并触发验证。验证采用验证方法:

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);:

当我们使用CCD_ 4=>

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

当我们使用IssuerSigningKey = signingKey,=>

Microsoft.IdentityModel.Tokens.SecurityTokenSignatureKeyNotFoundExceptionHResult=0x80131500消息=IDX10501:签名验证失败。无法匹配密钥:孩子:someId。捕获到异常:"。

我不知道如何配置TokenValidationParameters。当我往里看的时候https://login.microsoftonline.com/{tenant}/decovery/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

最新更新