Azure AD B2C结合ASP.NET Web API实现鉴权及访问MS Graph API方案咨询
问题根因
你拿到的用于后端鉴权的令牌是Azure AD B2C专门签发、受众为你的ASP.NET后端API的访问令牌,仅可用于你自有服务的鉴权,不符合MS Graph API的令牌校验规则,因此会返回Invalid x5t claim报错;同时B2C确实不支持OAuth2.0的on-behalf-of流,无法直接将用户令牌交换为Graph API的访问令牌。
保留B2C作为身份提供方的认证流实现方案
- 基础用户信息直接从令牌声明提取:在Azure AD B2C的用户流/自定义策略配置中,将你需要的用户属性(邮箱、显示名、用户ID、联系方式等)配置为需要返回的声明,这些属性会直接嵌入前端返回的id令牌和access令牌中,后端可以直接从
HttpContext.User.Claims中读取,无需调用额外接口。 - 自定义用户属性获取:如果需要获取令牌未携带的扩展用户属性,有两种可选方案:
- 将自定义属性配置为B2C用户的扩展属性,同样添加到令牌返回声明中,直接从请求上下文提取
- 后端使用服务到服务的客户端凭据流调用Graph API获取对应用户的全量数据
Graph API调用及Key Vault相关需求解决方案
- 合法调用Graph API的实现方式:
- 在你Azure租户的根AD下注册一个应用注册,为该应用授予Graph API的应用权限(而非委托权限),比如
User.Read.All、User.ReadWrite.All等你需要的权限,由租户管理员完成权限授权。 - 你的ASP.NET后端使用该应用的客户端ID、客户端密钥/证书,通过客户端凭据流申请受众为Graph API的访问令牌,调用时不要使用
/me端点,改为调用/users/{用户objectId}接口,其中用户objectId从当前请求的B2C令牌声明中直接提取即可。
- 在你Azure租户的根AD下注册一个应用注册,为该应用授予Graph API的应用权限(而非委托权限),比如
- Key Vault用户自有密钥存储实现:
不要直接给终端用户授予Key Vault或Graph API的操作权限,所有相关操作都由你的后端作为中间层代理:后端使用托管身份获取Key Vault的操作权限,收到用户操作请求时先校验当前用户的身份和权限,校验通过后由后端代为执行Key Vault的读写操作,不需要用户直接调用相关接口。
内容的提问来源于stack exchange,提问作者FoxyLoxy
相关产品推荐
相关产品推荐

