0

问题 我有几个现有的 Web 应用程序,其中一些是静态服务的 React SPA 应用程序。我想提供一个登录服务,允许每个应用程序登录以获取访问 JWT 令牌,该令牌可用于与 .net 核心 API 通信,以检索特定于登录用户的 JSON 数据。

我不希望使用隐式流(根据 OAuth 2 安全最佳实践)。我也不想为每个应用程序维护登录解决方案的代码。

可能的解决方案: 我编写了一个 .Net Core 应用程序,Web 应用程序可以重定向到该应用程序进行登录。我已经设置了 Azure AD B2C(当前使用登录 UI 的用户流)。

我还需要提供一个(POST)端点,可以将过期的访问令牌交换为新的有效访问令牌(使用在用户在 90 天内处于活动状态时不会过期的刷新令牌)。

尝试 1 - Microsoft Identity Web: 我尝试使用 Microsoft Identity Web 库,但我看不到任何方法可以提供一个端点,Web 应用程序可以在该端点处从旧的请求新的访问令牌。

尝试 2 - MSAL: 我曾尝试使用 MSAL,但缺少用于使其与 .Net Core 一起使用的文档,而且我不太了解如何使用AcquireTokenSilent,因为它需要令牌缓存中的可用帐户应用程序,我不能只将旧的访问令牌传递给它。更糟糕的是,将 MSAL 与 .Net 框架 4.5 一起使用的旧教程需要隐式流程,而没有任何解释为什么它不使用授权代码。

尝试 3 - POST 到 b2clogin.com 授权和令牌端点: 这是我工作的唯一解决方案,这可能是我的场景的正确答案。

我遵循了以下文档:Azure Active Directory B2C 中的 OAuth 2.0 授权代码流

所以基本上要登录(不包括参数):

GET https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?...

并获取访问/刷新令牌并使用刷新令牌更新访问令牌:

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token

注意!如果您想知道 {policy} 应该是什么,它是 B2C 中登录用户流的名称。

访问令牌在 API 中没有过期 我现在唯一剩下的问题是,我在登录用户流程中设置的 5 分钟生命周期的访问令牌在 API 中没有过期。即使 expires_in 正确显示 300 秒,我也可以在过期后很长时间内继续使用它。

但是,一旦我重新启动 API,过期的访问令牌就会停止工作。一旦我了解发生了什么,我将为此发布一个单独的问题并更新/删除它。

4

0 回答 0