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
相关产品推荐
相关产品推荐

