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
相关产品推荐
相关产品推荐

