2

我有一个自定义登录策略,它调用一个自定义 REST API,从我的数据库中获取有关用户的一些信息。

这些信息需要每隔一段时间更新一次,但我有能力每小时更新一次。

问题是,我们没有每小时提示用户登录。相反,我们每小时静默刷新令牌acquireTokenSilent

我需要以某种方式拦截acquireTokenSilent, 以使其调用我的自定义 REST API 并提取其他声明,就像我在自定义登录策略中那样。

有没有办法做到这一点?

4

2 回答 2

2

使用自定义策略在 Azure Active Directory B2C 中配置资源所有者密码凭据流一介绍了如何为令牌刷新实施用户旅程。

具体来说:

  1. 此用户旅程引用自JwtIssuer技术配置文件的RefreshTokenUserJourneyId元属性。
<ClaimsProvider>
  <DisplayName>Token Issuer</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="JwtIssuer">
      <Metadata>
        <!-- Point to the redeem refresh token user journey-->
        <Item Key="RefreshTokenUserJourneyId">ResourceOwnerPasswordCredentials-RedeemRefreshToken</Item>
      </Metadata>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>
  1. ResourceOwnerPasswordCredentials-RedeemRefreshToken用户旅程检查刷新令牌是否已失效。
<UserJourney Id="ResourceOwnerPasswordCredentials-RedeemRefreshToken">
  <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="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
  </OrchestrationSteps>
</UserJourney>

您可以将 API 调用添加到此用户旅程。

于 2019-07-04T22:23:36.703 回答
1

检查@Chris Padgett 的答案

您可以实现的一种方法是,

  1. 设置一个计时器来进行 Web API 调用(我猜你已经有一个可以提出静默续订请求了)
  2. 通过发送用户访问令牌从 JS 进行 [Authorize] REST API 调用
  3. 进行数据库调用以从 REST API 中提取详细信息并将它们保存在您的 SPA 应用程序本地变量中。
于 2019-07-04T13:07:29.190 回答