如何解决Azure App Service访问Azure Function时的401授权错误
问题复盘
- 已将Azure Function部署至Azure云环境,核心需求为:仅允许指定自有Azure App Service WebApp访问该Function,完全阻断公网匿名请求
- 已在Function配置中开启身份验证规则:未登录请求强制跳转Azure AD完成登录,手动完成登录流程后可正常执行Function逻辑
- 已完成Function对应的Azure AD应用注册,在应用注册的授权客户端应用板块添加了目标WebApp的应用ID
- 实际调用异常:WebApp向Function发起HTTP GET请求时,持续返回401未授权错误,页面提示“您无权查看此目录或页面”
对应配置过程的截图:



正确配置方案(解决401并满足访问管控需求)
出现401的核心原因:仅在应用注册页添加授权客户端ID,没有打通从WebApp获取令牌到Function校验令牌的全链路逻辑,导致请求无法通过身份验证中间件的校验。
具体操作步骤:
- 调整Function端的身份验证基础配置
- 进入Function的「身份验证」配置页,将未通过身份验证的请求处理规则设置为Azure Active Directory登录,彻底关闭匿名访问权限
- 检查AAD提供程序的访问令牌版本,将其统一设置为2.0版本,和后续客户端获取令牌的版本保持一致,避免版本不匹配导致的校验失败
- 打通WebApp到Function的令牌获取链路
- 依托Azure App Service的内置身份能力为WebApp分配系统托管标识,不要在WebApp代码中硬编码客户端密钥来获取令牌
- 在Function对应的应用注册的「API权限」板块,为WebApp的托管标识添加对应的应用访问权限,并完成租户级别的管理员授权同意
- 开启WebApp的令牌存储功能,确保WebApp发起Function请求时,能自动在请求头中携带格式为
Bearer <有效访问令牌>的授权信息
- 修正应用注册的授权配置逻辑
- 进入Function应用注册的「公开API」板块,确认已配置固定的应用ID URI(格式为
api://<Function应用的客户端ID>),后续WebApp获取令牌时必须把这个URI作为请求资源,不能直接用Function的HTTP URL作为资源 - 核对“授权客户端应用”列表中的ID值,必须和WebApp用于获取令牌的实际客户端ID完全匹配,ID填错会导致令牌直接被判定为无权限
- 进入Function应用注册的「公开API」板块,确认已配置固定的应用ID URI(格式为
- 补充网络层的访问管控(双重保障满足禁公网需求)
- 进入Function的「网络」配置页,配置访问限制规则,仅放行WebApp的固定出站IP段,从网络层直接阻断公网的无权限请求
- 对安全要求较高的场景,可以为Function配置私有端点,将其接入和WebApp同一个虚拟网络,彻底关闭Function的公网接入入口
快速排查401的方法
开启Function的应用服务诊断日志,定位身份验证模块的报错日志,90%以上的401报错都属于三类问题:
- WebApp发起的请求没有在请求头中携带有效的Authorization字段
- 携带的访问令牌的受众(aud)字段和Function配置的应用ID URI不匹配
- 令牌的签发版本和Function端配置的校验版本不一致
内容的提问来源于stack exchange,提问作者TomSelleck
相关产品推荐
相关产品推荐

