如何在Azure API Management中配置策略将JWT令牌传递给后端服务
解决方案
Azure APIM的validate-jwt策略默认不会移除原始请求的Authorization头,出现无法传递的情况通常是其他策略意外删除了该头,或者APIM配置的后端认证逻辑覆盖了Authorization头。以下是两种常用配置方案:
方案1:直接透传原始JWT令牌到后端
在inbound节点的validate-jwt策略后新增set-header策略,显式保留Authorization头:
<policies> <inbound> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid."> <openid-config *******************************/> <audiences> <audience>***********************</audience> </audiences> <issuers> <issuer>******************</issuer> </issuers> </validate-jwt> <!-- 新增以下策略透传Authorization头 --> <set-header name="Authorization" exists-action="override"> <value>@(context.Request.Headers.GetValueOrDefault("Authorization",""))</value> </set-header> <base /> </inbound> <backend> <base /> </backend> <outbound> <base /> </outbound> <on-error> <base /> </on-error> </policies>
如果你的APIM配置了后端托管身份/OAuth2认证,会默认覆盖Authorization头,此时可以改为透传到自定义头避免冲突:
<set-header name="X-Original-Authorization" exists-action="override"> <value>@(context.Request.Headers.GetValueOrDefault("Authorization",""))</value> </set-header>
方案2:提取JWT声明单独传递到后端
如果不需要完整JWT,只需要JWT内的特定声明(比如用户ID、角色),可以直接解析JWT后放到自定义头传递:
<set-header name="X-User-ID" exists-action="override"> <value>@(context.Request.Headers.Authorization.ParseJwt().Claims.GetValueOrDefault("sub", ""))</value> </set-header> <set-header name="X-User-Role" exists-action="override"> <value>@(context.Request.Headers.Authorization.ParseJwt().Claims.GetValueOrDefault("role", ""))</value> </set-header>
后端C# Azure Function接收示例
public static async Task<IActionResult> Run(HttpRequest req, ILogger log) { // 接收透传的完整JWT string jwtToken = req.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last(); // 如果用自定义头就改为 req.Headers["X-Original-Authorization"].FirstOrDefault() // 接收提取的声明 string userId = req.Headers["X-User-ID"].FirstOrDefault(); // 后续业务逻辑 }
内容的提问来源于stack exchange,提问作者johnson dubula
相关产品推荐
相关产品推荐

