You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 16:24:01