.net core 使用Azure Active Directory手动解码承载令牌,如何验证?

.net core 使用Azure Active Directory手动解码承载令牌,如何验证?,.net-core,jwt,asp.net-core-webapi,.net Core,Jwt,Asp.net Core Webapi,我正在一个NetCoreWebAPI应用程序中使用下面的代码,它运行良好 我可以解码它产生的JWT,但我也想验证它的签名。但是,我从哪里获得验证它的密钥 tenant = Configuration.GetSection("AzureAD:Tenant").Value; Logger.AppLogDebug("tenat value found: [{0}]", tenant); azureAdInstance = Con

我正在一个NetCoreWebAPI应用程序中使用下面的代码,它运行良好

我可以解码它产生的JWT,但我也想验证它的签名。但是,我从哪里获得验证它的密钥

            tenant = Configuration.GetSection("AzureAD:Tenant").Value;
            Logger.AppLogDebug("tenat value found: [{0}]", tenant);

            azureAdInstance = Configuration.GetSection("AzureAD:AzureADInstance").Value;
            Logger.AppLogDebug("azureAdInstance value found: [{0}]", azureAdInstance);

            audience = Configuration.GetSection("AzureAD:Audience").Value;
            Logger.AppLogDebug("Audience value found: [{0}]", audience);

        var authority = $"{azureAdInstance}{tenant}";
        Logger.AppLogDebug("authority value set to: [{0}]", authority);

        var authContext = new AuthenticationContext(authority);

        var clientCredential = new ClientCredential(key, secret);

            var token = authContext.AcquireTokenAsync(audience, clientCredential).Result.AccessToken;
            return new ObjectResult($"Bearer {token}");

您可以使用
JwtBearer
AddAzureADBearer
中间件来验证访问令牌。这样,当从客户端接收请求时,您的web api将自动解码令牌并验证签名。您可以参考以下链接了解如何使用这两个中间件:

如果您想手动验证jwt令牌,在验证访问令牌的签名时,您应该获得公钥,因为Azure AD可能会使用特定的一组公钥-私钥对中的任何一个对令牌进行签名,这些密钥可以在以下位置找到:

https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration 
在JSON响应中,您将看到一个属性
jwks_uri
,它是包含Azure AD的JSON Web密钥集的uri。与jwt令牌中的kid声明相匹配,您可以找到AAD用于使用非对称加密算法对令牌签名的密钥,例如默认情况下的
RSA 256

然后,您可以使用以下方法验证令牌:

public JwtSecurityToken validate(string token,string key){

    var rsa = new RSACryptoServiceProvider();
    string exponentvalue = "AQAB";
    var e = Base64UrlEncoder.DecodeBytes(exponentvalue);
    var N = key;
    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 = false,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = signingKey,
        ValidateLifetime = false
    };

    JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler();

    SecurityToken jwt;

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

    return jwt as JwtSecurityToken;
}
我没有测试上述代码,但您可以尝试从中开始

此外,您正在使用客户端凭据流来获取特定资源的令牌。如果资源是
Microsoft托管API
,例如
Microsoft Graph API
Azure管理API
等。。您不需要验证应用程序中的访问令牌。将带有令牌的请求发送到Microsoft托管API时,它将为您验证令牌