基于Azure AD on-behalf-of流限制用户MS Graph访问权限的方案咨询
方案合理性验证与核心疑问解答
你的整体设计思路是合理的,针对你最关心的「Web API能否代表仅持有User.Read scope的用户申请更高权限」的问题,分两种场景明确说明:
- 若走委托权限的OBO流:无法实现。OBO流要求用户本身已被授予对应权限的许可,申请的scopes不能超出用户已有权限范围,仅持有
User.Read的用户无法通过OBO流获取更高权限的委托令牌。 - 若走客户端凭据流获取应用级权限令牌:完全可以实现。应用级权限是你提前为Web API的服务主体在AAD中单独授予的,和前端用户持有的令牌权限无关,只要你在Web API层做好角色校验即可,也刚好匹配你需要执行委托权限不支持的操作(如创建用户)的需求。
流程优化建议
你原流程中混淆了OBO流和应用权限的使用逻辑,调整后的正确落地方案如下:
- 1~6步保持不变:SPA端仅申请最低权限
User.Read完成登录,用户发起高权限操作时,将用户令牌作为Bearer凭证传给Web API;Web API首先验证令牌有效性,再校验用户所属的AAD角色,仅Administrator角色可进入后续流程,Viewer角色直接返回403拒绝访问。 - 第7步调整:Web API不需要使用OBO流,直接通过客户端凭据流(使用自身的客户端ID、客户端密钥/证书)向AAD申请Graph的
User.ReadWrite.All、Directory.ReadWrite.All应用权限令牌即可。 - 8~9步保持不变:Web API用申请到的应用权限令牌调用MS Graph接口,完成操作后将结果返回给SPA。
关键注意事项
- 应用级权限的权限等级极高,所有调用高权限Graph接口的Web API接口必须做严格的角色校验,避免越权访问。
- Web API的客户端密钥/证书必须妥善存储,推荐使用密钥管理服务保管,禁止硬编码到代码或公开配置中。
- 仅当你需要执行必须关联用户身份的委托权限操作时,再考虑使用OBO流,当前创建用户的场景使用客户端凭据流更适配。
替代方案参考
如果不想额外维护Web API的权限逻辑,也可以使用AAD的应用角色功能,为SPA对应的应用注册配置Administrator、Viewer两个角色,在前端MSAL初始化时根据用户角色限制可申请的scopes。但该方案的权限限制在前端实现,可被用户手动篡改绕过,安全性远低于带后端校验的方案,仅适合非敏感场景使用。
内容的提问来源于stack exchange,提问作者Jeppe Christensen
相关产品推荐
相关产品推荐

