配置AAD并受APIM保护的Azure函数应用重定向URL认证失败
我有一个集成Microsoft Identity Provider(AAD应用)的Azure函数应用(V4版本),配置情况如下:
- 入站流量启用受限公共网络访问,仅允许从选定虚拟网络和IP地址访问
- 通过API Management(APIM)服务保护,直接访问函数应用域名会被拦截
- 已禁用函数应用代理,带有Swagger UI页面,且为保护该页面启用了身份验证
当前遇到的问题:通过https://apimanager.com/api/swagger/ui访问Swagger UI时,页面会重定向到Microsoft登录服务器,完成用户名密码输入后,最终重定向到https://myfunction.azurewebsites.net/.auth/login/aad/callback并返回Forbidden错误。相关授权请求示例:
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?response_type=...&redirect_uri=https://myfunctionapp.azurewebsites.net/.auth/login/aad/callback&client_id=...&state=redir%3D%/api/swagger/ui
要解决这个问题,需要调整AAD应用的回调配置,并通过APIM策略修改认证流程中的重定向逻辑,具体步骤如下:
1. 更新AAD应用的回调URL
在Azure AD门户中找到对应的AAD应用,添加APIM域名下的回调地址:
https://apimanager.com/.auth/login/aad/callback
同时保留原函数应用的回调地址,避免其他依赖场景受影响。
2. 配置APIM策略替换重定向URI
在APIM中,针对Swagger UI对应的API(或全局策略)添加以下策略,拦截授权请求并替换redirect_uri参数为APIM地址:
<inbound> <base /> <!-- 替换AAD授权请求中的redirect_uri为APIM域名地址 --> <set-query-parameter name="redirect_uri" exists-action="override"> <value>https://apimanager.com/.auth/login/aad/callback</value> </set-query-parameter> <!-- 回调后重写地址,将函数应用域名替换为APIM域名 --> <rewrite-uri template="@(context.Request.OriginalUrl.ToString().Replace("https://myfunction.azurewebsites.net", "https://apimanager.com"))" /> </inbound>
3. 配置APIM传递身份信息到函数应用
在APIM的后端策略中,确保将认证后的令牌或身份头传递给函数应用:
<backend> <base /> <forward-request /> </backend>
4. 验证网络与身份配置
确认函数应用的网络规则已允许APIM的IP或虚拟网络访问,同时检查函数应用的AAD身份提供者配置,确保关联了更新后的回调URL。
原问题的根源是认证流程中redirect_uri指向了受网络限制的函数应用域名,登录后直接访问该域名被拦截。通过将回调地址改为APIM域名,让APIM作为中间层处理认证回调,再转发到已被授权访问的函数应用,最终完成Swagger UI的身份验证跳转。
内容的提问来源于stack exchange,提问作者userahd

