如何为两个Azure App Service配置同一身份提供商实现正常访问
问题背景
- Azure中托管了2个独立App Service资源:1个ASP.NET网站、1个Web API
- 网站已经通过Authentication blade配置了身份提供程序,强制用户登录后才可访问所有页面
- 网站现有身份验证配置截图:

- 尝试给Web API复用目录中同一个现有应用注册配置身份验证后,网站侧无法正常访问任何Web API接口
- Web API现有身份验证配置截图:

核心原因
两个App Service直接绑定同一个Azure AD应用注册时,App Service内置的Easy Auth中间件默认会严格校验访问令牌的aud(受众)声明。前端用户登录后获取的令牌默认受众为前端站点本身,直接携带该令牌请求API时,API侧会判定令牌受众不匹配,直接返回401未授权错误,导致接口无法访问。
推荐配置方案(生产环境适用,符合安全规范)
不要给前端站点和API复用同一个应用注册,需要为两个服务分别配置独立的应用注册,再通过委托权限实现单点登录和合法接口调用,两个App Service各自绑定对应的应用注册即可:
- 为Web API创建独立应用注册
- 进入Azure AD应用注册页面,新建专用于API服务的应用注册,记录生成的应用程序(客户端) ID
- 进入该API应用注册的「公开API」菜单,设置应用ID URI(默认格式为
api://<API客户端ID>,也可绑定自定义域名) - 添加一个委托权限,例如命名为
User.Access,用于授权前端站点访问API资源
- 给前端原有应用注册配置API访问权限
- 进入前端网站绑定的原有应用注册页面,打开「API权限」菜单,选择「添加权限」-「我的API」,选中上一步创建的API应用注册,勾选刚才添加的委托权限
- 同租户部署场景下,直接点击「授予管理员同意」完成权限生效配置
- 调整前端登录令牌请求逻辑
前端触发用户登录时,需要将令牌请求的scope(作用域)参数设置为API暴露的权限值,格式为<API应用ID URI>/<权限名>,例如api://0000-0000-0000/User.Access,这样登录后拿到的令牌才是API认可的合法访问令牌
- 调整前端登录令牌请求逻辑
- 分别为两个App Service配置Easy Auth规则
- 前端App Service保持原有身份验证配置即可,绑定前端自身的应用注册,登录成功后会自动缓存对应作用域的访问令牌
- Web API的身份验证配置绑定专门为API创建的应用注册,将「未认证请求的处理逻辑」设置为返回401未授权,不要开启登录页面跳转,API侧会自动完成令牌合法性、受众匹配性校验
- 前端调用API时携带合法令牌
前端发起API请求时,从当前登录会话中取出对应API作用域的访问令牌,放到请求头的Authorization字段中,格式为Bearer <访问令牌内容>,API校验通过后就会正常响应请求。
- 前端调用API时携带合法令牌
临时快速修复方案(仅测试环境适用)
如果不想新增应用注册,一定要复用同一个应用注册,可以通过调整API侧的受众校验规则快速恢复访问:
- 进入Web API的App Service身份验证配置页,找到已绑定的Microsoft身份提供程序,打开高级编辑选项
- 在「允许的令牌受众」配置项中,添加前端站点对应的应用客户端ID、应用ID URI值
- 保存配置后重启App Service,此时API就会认可前端拿到的同应用注册签发的令牌,不会再返回权限错误
注意:该方案没有做服务间的权限隔离,不符合最小权限安全原则,禁止在生产环境使用。
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

