【问题标题】:Call Custom REST API When Refreshing Access Token刷新访问令牌时调用自定义 REST API
【发布时间】:2019-11-15 02:02:35
【问题描述】:

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

这些信息需要每隔一段时间更新一次,但我可以负担得起每小时更新一次。

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

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

有办法吗?

【问题讨论】:

  • 你在开发什么样的应用程序? SPA 或 MVC 还是其他?
  • @Ramakrishna 我有一个调用 ASP.NET Core Web API 的 SPA(角度)

标签: azure azure-active-directory azure-ad-b2c identity-experience-framework


【解决方案1】:

查看@Chris Padgett 的答案

一种你可以实现的方式,

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

【讨论】:

  • 1.实际上,我在每次请求之前都会致电acquireTokenSilent。如果令牌过期,该方法会自动刷新令牌。 2. 如果我将附加声明存储在客户端中,那么服务器将不得不验证每个请求,这就是我想通过将它们存储在令牌中来避免的。
【解决方案2】:

The Configure the resource owner password credentials flow in Azure Active Directory B2C using a custom policy article 描述了如何为令牌刷新实施用户旅程。

具体来说:

  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 调用添加到此用户旅程。

【讨论】:

  • 我试过了,但在这里添加额外的声明不会刷新访问令牌中传递的声明。你有运气测试这个吗?还没有运气地看了你的其他答案-> stackoverflow.com/a/49603509/1371639
  • 有人让这个工作吗?我和@Karthik 有同样的问题......在将 REST 调用添加到旅程后,访问令牌中没有更新声明。就像添加断点表明它会触发一样,只是令牌没有变化。
  • @TimHarker - 当我去年这样做时 - 我们无法使用开箱即用的 B2C 设置刷新声明。您需要向 Microsoft 提出请求,以便为您的 Azure AD 租户启用此功能(他们在后端为您做了一些魔术)。
  • 这方面有什么更新吗?我已经实现了它并遇到了同样的行为。当我执行令牌刷新时,我可以看到它到达了我的 REST 端点,并且 UserJourneyRecorder 显示了更新后的声明值,但是返回给客户端的 id_token 仍然反映了旧值。
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 2022-01-21
  • 2018-01-05
  • 2023-04-01
  • 2019-11-20
  • 1970-01-01
  • 2019-06-29
  • 2017-06-26
相关资源
最近更新 更多