如何在 Azure API 管理中使用 validate-jwt 策略验证使用 RS256 算法签名的 JWT

Posted

技术标签:

【中文标题】如何在 Azure API 管理中使用 validate-jwt 策略验证使用 RS256 算法签名的 JWT【英文标题】:How to validate JWT signed with RS256 Algorithm with validate-jwt policy in Azure API management 【发布时间】:2016-08-31 05:16:36 【问题描述】:

我可以通过设置<issuer-signing-keys> 属性在 Azure API 管理中使用 validate-jwt 策略成功验证使用 HS256 签名的 JWT。但是如何验证使用 RS256 签名的 JWT?我尝试将公钥或证书放入<issuer-signing-keys>,但它不起作用。

【问题讨论】:

【参考方案1】:

目前验证 rsa 签名令牌的唯一方法是使用 openid url。

【讨论】:

感谢您的快速回复!顺便问一下,有没有计划通过直接在 validate-jwt 策略中嵌入公钥来支持验证 rsa 签名的令牌? 还是这样吗?从文档中看起来像。有这个选项就好了 我相信还是这样。我使用了 open id 配置【参考方案2】:

我能够使用以下策略验证这样的令牌

<issuer-signing-keys>
    <key certificate-id="my-rsa-cert" />
</issuer-signing-keys>

您可以通过以下步骤做到这一点:

    使用以下命令创建证书

    openssl.exe req -x509 -nodes -sha256 -days 3650 -subj "/CN=Local" -newkey rsa:2048 -keyout Local.key -out Local.crt openssl.exe pkcs12 -export -in Local.crt -inkey Local.key -CSP "Microsoft Enhanced RSA and AES Cryptographic Provider" -out Local.pfx

    在 ID 为“my-rsa-cert”的 API 管理中加载证书“Local.pfx”。

    使用以下代码从证书生成令牌

     /////////////////////////////////////////////
     // Token Generation
     var CLIENT_ID = "Local";
     var ISSUER_GUID = "b0123cec-86bb-4eb2-8704-dcf7cb2cc279";
    
     var filePath = @"..\..\..\Cert\Local.pfx";
     var x509Certificate2 = new X509Certificate2(filePath, "<certpwd>");
    
     var signingCredentials = new X509SigningCredentials(x509Certificate2, SecurityAlgorithms.RsaSha256Signature); //, SecurityAlgorithms.Sha256Digest
     var tokenHandler = new JwtSecurityTokenHandler();
    
     var originalIssuer = $"CLIENT_ID";
     var issuer = originalIssuer;
    
     DateTime utcNow = DateTime.UtcNow;
    DateTime expired = utcNow + TimeSpan.FromHours(1);
    
     var claims = new List<Claim> 
             new Claim("aud", "https://login.microsoftonline.com/YOUR_TENENT_ID/oauth2/token", ClaimValueTypes.String, issuer, originalIssuer),
             new Claim("exp", "1460534173", ClaimValueTypes.DateTime, issuer, originalIssuer),
             new Claim("jti", $"ISSUER_GUID", ClaimValueTypes.String, issuer, originalIssuer),
             new Claim("nbf", "1460533573", ClaimValueTypes.String, issuer, originalIssuer),
             new Claim("sub", $"CLIENT_ID", ClaimValueTypes.String, issuer, originalIssuer)
         ;
    
     ClaimsIdentity subject = new ClaimsIdentity(claims: claims);
    
     var tokenDescriptor = new SecurityTokenDescriptor
     
         Subject = subject,
         Issuer = issuer,
         Expires = expired,
    
         //TokenIssuerName = "self",
         //AppliesToAddress = "https://www.mywebsite.com",
         //Lifetime = new Lifetime(now, now.AddMinutes(60)),
         SigningCredentials = signingCredentials,
     ;
    
     JwtSecurityToken jwtToken = tokenHandler.CreateToken(tokenDescriptor) as JwtSecurityToken;
     jwtToken.Header.Remove("typ");
     var token = tokenHandler.WriteToken(jwtToken);
    
     this.Output = jwtToken.ToString();
     this.Output += "\r\n" + token.ToString();
    
    
     JwtSecurityToken jwtToken = tokenHandler.CreateToken(tokenDescriptor) as JwtSecurityToken;
     jwtToken.Header.Remove("typ");
     var token = tokenHandler.WriteToken(jwtToken);
    

    使用生成的承载令牌向 API 发送请求

【讨论】:

以上是关于如何在 Azure API 管理中使用 validate-jwt 策略验证使用 RS256 算法签名的 JWT的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure API 管理从身份提供者缓存 JWKS 以验证 JWT

如何在 Azure API 管理策略中重用响应上下文变量?

如何使用 Azure API 管理设计微服务架构中的身份验证和授权策略?

Azure API 管理 - 如何刷新访问令牌后端 API?

如何使用 Azure API 管理为 API 中的每个方法设置 405 Method Not Allowed

如何在 Azure API 管理上分离开发和生产环境?