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

Azure APIM中JWT认证适配浏览器的策略配置需求

适配浏览器访问场景的Azure APIM JWT验证重定向策略

你需要在原有JWT验证策略基础上,增加浏览器请求的判断与重定向逻辑:针对浏览器发起的请求,若未携带有效Bearer令牌,自动重定向至Azure AD授权页面获取令牌;非浏览器请求仍保持原401错误返回逻辑。

以下是修改后的完整入站策略代码:

<choose>
    <!-- 识别浏览器请求:通过User-Agent和Accept头判断 -->
    <when condition="@(context.Request.Headers.GetValueOrDefault("User-Agent", "").Contains("Mozilla") || context.Request.Headers.GetValueOrDefault("Accept", "").Contains("text/html"))">
        <validate-jwt header-name="Authorization" failed-validation-httpcode="200" failed-validation-error-message="Unauthorized. Access token is missing or invalid." require-scheme="Bearer">
            <openid-config url="https://login.microsoftonline.com/{{tenant-id}}/v2.0/.well-known/openid-configuration" />
            <audiences>
                <audience>{{azure-managed-api}}</audience>
                <audience>{{api-audience}}</audience>
            </audiences>
            <issuers>
                <issuer>{{aad-issuer-url}}</issuer>
            </issuers>
            <required-claims>
                <claim name="aud">
                    <value>{{azure-managed-api}}</value>
                </claim>
            </required-claims>
        </validate-jwt>

        <!-- 验证失败时重定向到Azure AD授权端点 -->
        <choose>
            <when condition="@(context.Response.StatusCode == 200 && context.Response.Body.As<string>().Contains("Unauthorized"))">
                <return-response>
                    <set-status code="302" reason="Found" />
                    <set-header name="Location" exists-action="override">
                        <value>@{
                            var tenantId = "{{tenant-id}}";
                            var clientId = "{{frontend-client-id}}"; // 替换为你的前端应用注册ID
                            var redirectUri = "{{redirect-uri}}"; // 替换为AAD中配置的前端回调地址
                            var scope = $"api://{{api-audience}}/.default"; // 替换为你的API权限范围
                            var state = Guid.NewGuid().ToString(); // 生成随机State防止CSRF

                            return $"https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize?client_id={clientId}&response_type=code&redirect_uri={Uri.EscapeDataString(redirectUri)}&scope={Uri.EscapeDataString(scope)}&state={state}";
                        }</value>
                    </set-header>
                </return-response>
            </when>
        </choose>
    </when>
    <!-- 非浏览器请求保持原验证逻辑 -->
    <otherwise>
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid." require-scheme="Bearer">
            <openid-config url="https://login.microsoftonline.com/{{tenant-id}}/v2.0/.well-known/openid-configuration" />
            <audiences>
                <audience>{{azure-managed-api}}</audience>
                <audience>{{api-audience}}</audience>
            </audiences>
            <issuers>
                <issuer>{{aad-issuer-url}}</issuer>
            </issuers>
            <required-claims>
                <claim name="aud">
                    <value>{{azure-managed-api}}</value>
                </claim>
            </required-claims>
        </validate-jwt>
    </otherwise>
</choose>

关键配置说明

  • 浏览器请求识别:通过User-Agent包含Mozilla或Accept头包含text/html标记判断浏览器请求,可根据实际场景调整判断条件。
  • 验证结果适配:将浏览器请求的验证失败状态码临时设为200,避免直接返回401触发浏览器默认错误页,后续通过响应内容判断触发重定向。
  • 授权URL参数替换:需手动替换以下占位符:
    • {{frontend-client-id}}:Azure AD中注册的前端应用ID,用于发起用户授权请求。
    • {{redirect-uri}}:前端应用的回调地址,需与Azure AD应用注册中配置的重定向URI完全一致。
    • {{api-audience}}:你的API受众标识符,需与JWT验证配置中的值匹配。
  • CSRF防护:生成随机state参数,前端回调后需验证该参数,防止跨站请求伪造攻击。

内容的提问来源于stack exchange,提问作者harshavmb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:45