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

Azure B2C - MSAL:无需登出/登录能否更新现有会话声明?

解决方案

可以不用登出/重新登录,通过MSAL触发新的授权请求来获取包含更新角色声明的访问令牌,核心思路是强制Azure B2C重新执行令牌增强流程,具体步骤如下:

1. 调整Azure B2C自定义策略

修改你的自定义策略,支持从授权请求的查询参数中接收当前活跃公司ID,并基于该ID生成对应的角色声明:

  • 在ClaimsSchema中添加用于存储当前公司ID的声明:
    <ClaimType Id="currentCompanyId">
      <DisplayName>Current Company ID</DisplayName>
      <DataType>string</DataType>
    </ClaimType>
    
  • 在用户旅程的编排步骤中,添加TechnicalProfile读取查询参数里的currentCompanyId并存储为声明:
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="ReadCurrentCompanyId" TechnicalProfileReferenceId="GetCurrentCompanyIdFromQuery" />
      </ClaimsExchanges>
    </OrchestrationStep>
    
    对应的TechnicalProfile配置:
    <TechnicalProfile Id="GetCurrentCompanyIdFromQuery">
      <DisplayName>Get Current Company ID from Query Parameter</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="currentCompanyId" PartnerClaimType="currentCompanyId" DefaultValue="" />
      </OutputClaims>
    </TechnicalProfile>
    
  • 在令牌增强的TechnicalProfile中,基于currentCompanyId声明获取用户在该公司的角色,合并平台级角色后添加到roles声明中。

2. 客户端MSAL调用逻辑

当用户切换活跃公司后,调用MSAL的授权方法触发新的令牌请求,传递当前公司ID参数(以MSAL.js为例):

const request = {
  scopes: ["https://your-b2c-domain.onmicrosoft.com/api/access_as_user"],
  extraQueryParameters: { currentCompanyId: "selected-company-id" },
  prompt: "none" // 利用现有会话,无需用户重新输入密码
};

try {
  const response = await msalInstance.acquireTokenPopup(request);
  // 用更新后的访问令牌和声明替换原有内容
  console.log("Updated token with new roles:", response.idTokenClaims.roles);
} catch (error) {
  // 若静默请求失败(如会话过期),降级到账户选择(无需输密码)
  if (error instanceof InteractionRequiredAuthError) {
    const fallbackRequest = { ...request, prompt: "select_account" };
    const response = await msalInstance.acquireTokenPopup(fallbackRequest);
    // 处理更新后的令牌
  }
}

这里prompt="none"会尝试复用用户现有会话静默获取新令牌,同时触发Azure B2C重新执行令牌增强流程,生成包含当前公司角色的新声明。如果静默请求失败,再通过prompt="select_account"让用户确认账户即可。

3. 关键注意事项

  • 刷新令牌流程(acquireTokenSilent默认逻辑)不会触发Azure B2C完整用户旅程和令牌增强,必须发起新的授权请求才能更新声明。
  • 确保自定义策略中,令牌增强逻辑在所有授权请求中都会执行,而非仅初始登录阶段。
  • 对传递的currentCompanyId参数需在策略中做合法性验证,防止恶意篡改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:03:27