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

基于Azure B2C实现React与.NET多应用SSO的技术咨询

跨应用SSO实现方案(React SPA + .NET应用)

一、从React应用跳转至.NET应用的无跳转静默登录

受浏览器第三方Cookie限制,ssoSilent可靠性极低,推荐以下两种方案:

  • 后端令牌兑换方案:
    React应用登录后,将加密后的id_token或授权码(若使用授权码流)作为参数传递给.NET应用。.NET后端拿到参数后,直接调用Azure AD令牌端点,换取自身应用的令牌,完成登录会话建立。全程由后端处理,不受前端第三方Cookie限制。
  • 同域会话共享(仅限子域名场景):
    如果两个应用属于同根域名(如app1.example.com和app2.example.com),可将msal的核心令牌信息存入localStorage(需配合HTTPS降低安全风险)。.NET应用前端读取localStorage中的id_token,后端验证令牌有效性后直接建立用户会话。跨主域名场景不适用。

二、从.NET应用返回React应用的无跳转静默登录

同样避开ssosilent,用以下方式实现:

  • 利用msal内置的refresh_token刷新机制:
    React应用的msal库默认会用会话存储中的refresh_token静默刷新令牌,无需跳转。只需调用acquireTokenSilent方法,msal会自动处理令牌刷新:
    const silentRequest = {
      scopes: ["openid", "profile", "your-api-scope"],
      account: msalInstance.getActiveAccount() // 从会话存储读取已登录账户
    };
    try {
      const response = await msalInstance.acquireTokenSilent(silentRequest);
      // 令牌自动更新至会话存储
    } catch (error) {
      // 仅当refresh_token失效时才触发跳转
      if (error instanceof InteractionRequiredAuthError) {
        msalInstance.acquireTokenRedirect(silentRequest);
      }
    }
    
  • 跳转时传递加密身份标识:
    .NET应用跳转回React时,携带加密的用户唯一标识参数。React应用拿到后,验证该标识有效性,再调用loginPopup(隐藏式弹窗,接近无跳转体验)或直接用refresh_token恢复会话。

三、关于refresh_token的使用疑问

  1. msal能否用refresh_token实现登录?
    可以。msal的acquireTokenSilent方法内部优先使用refresh_token刷新令牌,只要会话存储中的refresh_token未过期,就能静默获取新的id_token和access_token,无需跳转登录页。无需手动调用令牌API,msal会自动处理令牌的存储与刷新。
  2. .NET应用调用OAuth令牌API用refresh_token获取声明是否可行?
    可行,但需满足两个前提:
  • 初始登录时已申请offline_access权限(这是获取refresh_token的必要条件);
  • .NET后端调用Azure AD令牌端点时,需携带refresh_token、客户端ID、客户端密钥(机密客户端场景),换取新令牌后解析声明。注意Azure AD会定期轮换refresh_token,需妥善存储最新的令牌。

四、React应用手动调用OAuth令牌API后的令牌存储

若必须手动调用令牌API而非依赖msal,需模拟msal的存储逻辑:

  • 存储位置:优先用sessionStorage(与msal默认一致,会话结束自动清除),敏感场景可配合HTTPS加密后存入localStorage;
  • 存储结构:至少包含以下内容:
    • id_token:用户身份令牌
    • access_token:资源访问令牌
    • refresh_token:刷新令牌
    • expires_at:令牌过期时间戳(用于判断是否需要刷新)
    • account:用户账户信息(如用户名、租户ID)
  • 刷新逻辑:每次请求资源前检查access_token是否过期,若过期则用refresh_token调用令牌端点获取新令牌,更新存储内容。

注意:手动处理令牌容易出现过期判断、令牌轮换、安全存储等问题,优先使用msal内置方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:02:42