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

后端如何验证前端MSAL-React获取的Azure AD身份令牌

后端校验MSAL令牌、获取用户信息实现方案

整个流程遵循OAuth2.0与Azure AD标准规范即可落地,优先推荐性能更高的本地验签方案,也可以根据需求选择接口校验方案。

前置要求

前端传递令牌时必须遵循标准格式:将针对后端API申请的访问令牌(Access Token,不能用前端登录返回的ID Token)放在请求头Authorization中,格式为Bearer <令牌内容>。前端需要通过MSAL-React的acquireTokenSilent方法,传入后端API对应的权限作用域(scope)申请专用访问令牌,不能直接把前端登录态用的ID Token传给后端。


方案一:本地JWT验签(生产环境推荐)

Azure AD颁发的访问令牌是标准JWT格式,自带防篡改签名,不需要每次请求都调用Azure AD接口校验,本地验签延迟更低、无接口限流风险,实现步骤如下:

  • 基础声明校验:先解码JWT的载荷部分,优先校验核心声明,不符合要求直接返回401:
    • iss(签发方):必须和你所用Azure AD环境、租户的签发端点匹配
    • aud(受众):必须和你后端API在Azure AD中注册的应用ID、或配置的应用ID URI完全一致,防止其他应用的令牌串用访问
    • exp(过期时间):必须晚于当前UTC时间,过期令牌直接拒绝
    • nbf(生效时间):必须早于当前UTC时间,未生效令牌直接拒绝
    • tid(租户ID):单租户场景下必须和你指定的Azure租户ID匹配,多租户场景需要匹配你配置的允许租户列表
    • scp/roles(权限声明):必须包含当前访问路由所需的委托权限或应用角色,不满足权限要求返回403
  • 签名校验:Azure AD的签名公钥会通过公开的JWKS端点发布,不需要手写公钥拉取、轮换、缓存逻辑,直接使用对应技术栈成熟的Azure AD资源服务校验库即可,库会自动根据JWT头部的kid字段匹配对应公钥,验证令牌签名是否合法,确认令牌没有被篡改。
    常见技术栈都有成熟的适配组件:.NET生态用Microsoft.Identity.Web,Java Spring生态用spring-security-oauth2-resource-server搭配Azure AD starter,Node.js生态可以用passport-azure-ad,Python生态可以用PyJWT搭配JWKS自动拉取组件。
  • 获取用户信息:验签通过后,JWT载荷中已经自带基础用户信息:oid对应用户在租户内的唯一不变ID,preferred_username对应用户登录账号,name对应用户显示名,email对应用户邮箱(租户配置该声明时返回),这些字段直接从解码后的载荷中读取即可。如果需要获取令牌中没包含的用户目录属性(比如部门、职位、手机号等),再按需调用Microsoft Graph接口查询即可,注意要提前给后端API注册对应Graph的访问权限。

方案二:调用Azure AD令牌内省接口(适合轻量场景)

如果不想实现本地验签逻辑,也可以直接调用Azure AD的令牌内省接口完成校验,注意该方案每次API请求都要发起一次对Azure AD的HTTP调用,延迟更高,需要留意Azure AD的接口限流规则:

  • 从Azure AD对应版本的开放元数据配置中找到introspection_endpoint(令牌内省端点)地址
  • 后端调用该接口时,使用自身在Azure AD注册的应用客户端ID、客户端密钥做身份认证,POST请求传入参数token=<前端传来的访问令牌>
  • 如果接口返回active: true,说明令牌合法,返回体中会同时附带该令牌关联的所有用户信息、权限声明、有效期信息,直接使用即可;如果返回active: false,说明令牌无效、过期或不属于你的应用,直接返回401即可。

常见避坑点

  • 不要硬编码Azure AD的签名公钥,Azure AD会定期轮换签名密钥,必须通过JWKS端点自动拉取缓存,否则公钥轮换后会导致全站验签失败
  • 不要跳过aud和iss的校验,否则会出现任意合法Azure AD令牌都能访问你接口的安全漏洞
  • 多租户场景下必须加租户允许列表校验,否则所有Azure AD用户拿到的令牌都能尝试访问你的服务

内容的提问来源于stack exchange,提问作者Devon S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:21:29