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

Azure DevOps WebHook调用带AAD身份验证的Azure Function返回401,如何配置?

配置AAD认证的Azure Function允许同租户Azure DevOps WebHook调用

核心误区纠正

你之前在App Service中设置的「API权限」方向错误:需要授权Azure DevOps的服务主体访问你的Azure Function,而非给Function添加Azure DevOps的权限。以下是正确配置步骤:


步骤1:获取Azure Function对应的AAD应用注册信息

  • 打开Azure Function的「身份验证」页面,找到已启用的Microsoft Identity Provider,点击「管理应用注册」进入对应页面。
  • 复制该应用注册的应用程序ID URI(格式通常为api://<function-app-client-id>)。

步骤2:为Azure DevOps服务主体授予Function访问权限

  • 在上述应用注册的「应用权限」页面,点击「添加权限」→选择「我的API」,找到Function对应的应用注册。
  • 添加应用权限(注意不是委派权限),选择默认的user_impersonation或自定义权限(若已定义),然后点击「授予管理员同意」完成权限生效。

步骤3:配置Azure DevOps WebHook的OAuth身份验证

  • 进入Azure DevOps项目的「项目设置」→「服务挂钩」,新建或编辑目标WebHook。
  • 在「身份验证」区域选择「OAuth 2.0」,填入以下参数:
    • 租户ID:你的AAD租户ID
    • 客户端ID:Azure DevOps在AAD中的服务主体应用程序ID(可在AAD企业应用中搜索「Azure DevOps」获取)
    • 客户端密钥:Azure DevOps服务主体的客户端密码(若未创建,需在AAD中为该服务主体生成客户端密码)
    • 资源:步骤1中复制的Function应用程序ID URI
  • 保存WebHook配置。

步骤4:验证Function的授权规则

  • 回到Azure Function的「身份验证」页面,确保「未经身份验证的请求」设置为「拒绝(推荐)」。
  • 可在Function代码中添加令牌验证逻辑(以C#为例):
    var authHeader = req.Headers["Authorization"].ToString();
    if (!authHeader.StartsWith("Bearer ")) return new UnauthorizedResult();
    
    var token = authHeader.Substring(7);
    var jwtToken = new JwtSecurityTokenHandler().ReadJwtToken(token);
    
    // 验证受众是否匹配Function的应用ID URI
    if (!jwtToken.Audiences.Contains("api://<your-function-app-id-uri>"))
        return new UnauthorizedResult();
    
    // 验证发行者是否为当前租户AAD
    if (!jwtToken.Issuer.Equals("https://sts.windows.net/<your-tenant-id>/"))
        return new UnauthorizedResult();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:23:28