azure-ad-b2c - 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"
}
}
}
解决方案
感谢 Jas 和他在这个 GitHub 问题上的示例,我将 RefreshToken 用户旅程添加Endpoints
到我的依赖方文件中,这解决了我的问题。
我现在看到从令牌刷新返回的 ID 令牌中的最新声明。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<Endpoints>
<Endpoint Id="Token" UserJourneyReferenceId="RefreshToken" />
</Endpoints>
...
</RelyingParty>
推荐阅读
- docker - 无法使用 Aws ECS fargate 容器连接到 Aurora MySql
- sql-server - UWP 尝试通过 EFCore 连接到 SQL Server Express 时出错
- django - Django 无法在 Serializer 上设置 IntegerField
- c# - 如何从另一个脚本c#实例化函数中的对象
- javascript - 使用 cookie 在 jQuery 中关闭后不显示弹出窗口
- c# - 如何更新我的 acumatica 数据库中的单行
- javascript - 从 node.js 中的 esm 模块开始给出错误:找不到模块
- r - RStudio 在启动时自动运行某些东西
- python-3.x - paramiko.ssh_exception.SSHException:读取 SSH 协议横幅时出错
- android - 在 Kotlin 的私有类中调用 onBackPressed