6

我们有 Azure AD B2C 设置以使用身份体验框架,并在登录/注册时进行 REST 调用以通过 Azure 函数获取额外的安全凭据声明。这工作正常。

当我们通过 Azure AD B2C 通过 Refresh_Token 请求访问/Id 令牌时,看起来我们得到了相同的令牌,并且它不会调用 REST API 来获取最新更新的令牌声明。是否有可能改变这个用户旅程呢?

是否有另一种解决方案来刷新令牌而无需再次登录以获取最新更新?

(我们可以在代码中解决这个问题,而不是使用令牌,但出于各种原因,我们想先探索一下)。

4

1 回答 1

2

您可以声明一个刷新令牌用户旅程,它调用您的 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。

最后的编排步骤发布新的令牌。

您必须使用带有JwtIssuer技术配置文件的RefreshTokenUserJourneyId元数据项引用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>
于 2018-04-01T23:16:33.257 回答