首页 > 解决方案 > Azure B2C 刷新令牌用户旅程不会更改 id_token 中的声明

问题描述

根据ROPC 流程的 MS 文档,我添加了一个自定义用户旅程,用于使用授权代码流程在我的应用程序中刷新令牌。我已经RefreshTokenUserJourneyId使用我的新 User Journey 的 Id 添加了元数据RefreshToken

这样做的关键原因是进行 REST 调用以获取更新的声明isVerified。这与我在注册期间使用的 REST TP 相同,并且运行良好。

鉴于我有一个带有 的令牌isVerified = true,我更新我的数据库以说明用户不再经过验证,然后我刷新了令牌。我可以看到 B2C 调用我的 REST 端点。我可以在 Application Insights 中看到状态包具有正确的值isVerified = false。但id_token返回的仍然具有旧值isVerified = true

为什么SendClaims不使用状态包中的正确值?

B2C 需要做什么才能生成具有最新声明的新令牌?这是因为我没有使用 ROPC 流程,而是使用授权代码流程吗?

用于注册的 JwtIssuer TP:

<TechnicalProfile Id="JwtIssuer">
    <Protocol Name="OpenIdConnect" />
    <Metadata>
        <Item Key="token_lifetime_secs">900</Item>
        <Item Key="id_token_lifetime_secs">900</Item>
        <Item Key="refresh_token_lifetime_secs">1209600</Item>
        <Item Key="allow_infinite_rolling_refresh_token">true</Item>
        <Item Key="RefreshTokenUserJourneyId">RefreshToken</Item>
    </Metadata>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-OAuth-issuer" />
</TechnicalProfile>

RefreshToken 用户旅程:

<UserJourney Id="RefreshToken">
    <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
    <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="RefreshTokenSetupExchange" TechnicalProfileReferenceId="SM-RefreshTokenReadAndSetup" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="RESTGetUserCrm" TechnicalProfileReferenceId="SP-GetUser"/>
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    </OrchestrationSteps>
</UserJourney>

UserJourneyRecorder 输出显示状态包中更新的声明:

{
  "Kind": "Action",
  "Content": "Web.TPEngine.StateMachineHandlers.TokenExchangeHandler"
},
{
  "Kind": "HandlerResult",
  "Content": {
    "Result": true,
    "Statebag": {
      "Complex-CLMS": {
        "objectId": "...",
        "refreshTokenIssuedOnDateTime": "7/2/2021 2:59:13 AM",
        "refreshTokensValidFromDateTime": "2021-06-08T07:16:24Z",
        "isVerified": "False",
        "role": "broker",
        "companyId": "...",
        "tenantId": "..."
      },
      "CT": {
        "c": "2021-07-02T03:02:09.7703777Z",
        "k": "CT",
        "v": "Spa",
        "p": true
      },
      "ComplexItems": "_MachineEventQ, TCTX, EX_T, REPRM, AUPRM, PRMCH"
    }
  }
}

标签: azure-ad-b2cidentity-experience-framework

解决方案


感谢 Jas 和他在这个 GitHub 问题上的示例,我将 RefreshToken 用户旅程添加Endpoints到我的依赖方文件中,这解决了我的问题。

我现在看到从令牌刷新返回的 ID 令牌中的最新声明。

<RelyingParty> 
  <DefaultUserJourney ReferenceId="SignUpOrSignIn" /> 
    <Endpoints> 
      <Endpoint Id="Token" UserJourneyReferenceId="RefreshToken" /> 
    </Endpoints>
    ...    
</RelyingParty> 

推荐阅读