我们使用Azure AD B2C设置来使用Identity Experience Framework,并且在登录/注册时,会通过Azure函数进行REST调用以获取额外的安全凭据声明。这很好。
当我们通过Azure AD B2C通过Refresh_Token请求访问/ Id令牌时,看起来我们得到相同的令牌,并且它不会调用REST API来获取最新更新的令牌声明。是否有可能改变这个用户之旅呢?
是否有其他解决方案可以刷新令牌而无需再次登录以获取最新更新?
(我们可以在代码中解决这个问题而不使用令牌,但出于各种原因,我们首先要探讨这个问题。)
答案 0 :(得分:1)
您可以声明刷新令牌用户旅程,该旅程调用您的REST API,如下所示:
<UserJourney Id="TokenRefresh">
<PreserveOriginalAssertion>false</PreserveOriginalAssertion>
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="RefreshTokenExchange" TechnicalProfileReferenceId="TpEngine_RefreshToken" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
</ClaimsExchanges>
</OrchestrationStep>
<!-- TODO: Add an orchestration step that calls the REST API. -->
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
初始编排步骤调用 TpEngine_RefreshToken 技术配置文件,该配置文件从当前刷新令牌读取 objectId 声明:
<ClaimsProvider>
<DisplayName>Trustframework Policy Engine Technical Profiles</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="TpEngine_c3bd4fe2-1775-4013-b91d-35f16d377d13">
<DisplayName>Trustframework Policy Engine Default Technical Profile</DisplayName>
<Protocol Name="None" />
<Metadata>
<Item Key="url">{service:te}</Item>
</Metadata>
</TechnicalProfile>
<TechnicalProfile Id="TpEngine_RefreshToken">
<DisplayName>Trustframework Policy Engine Refresh Token Technical Profile</DisplayName>
<Protocol Name="None" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId" />
</OutputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
第二个业务流程步骤调用 AAD-UserReadUsingObjectId 技术配置文件,该配置文件通过 objectId 声明从登录用户的Azure AD B2C目录中读取声明。
另一个业务流程步骤可以调用您的REST API。
最终的业务流程步骤会发布新令牌。
您必须使用 RefreshTokenUserJourneyId 元数据项和 JwtIssuer 技术配置文件引用 TokenRefresh 用户旅程,以便此技术发布的令牌此用户旅程会刷新个人资料:
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="JwtIssuer">
<DisplayName>JWT Issuer</DisplayName>
<Protocol Name="None" />
<OutputTokenFormat>JWT</OutputTokenFormat>
<Metadata>
<Item Key="client_id">{service:te}</Item>
<Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
<Item Key="RefreshTokenUserJourneyId">TokenRefresh</Item>
<Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
</Metadata>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
<Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer" />
</CryptographicKeys>
<InputClaims />
<OutputClaims />
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>