OAuth2 保护 API。如何允许客户使用自己的授权服务器进行 SSO?

OAuth2 protected API. How to allow customer's to SSO using its own authorization server?

我有一个 Angular 单页应用程序 (SPA) 与我的 ASP.NET API 通信。 API 由我自己的 Oauth2 服务器 (IdentityServer4) 保护。

我的一个客户(我们称他为 X)想要 SSO:他们在我平台上的用户将在他们的服务器上登录,而不是使用我的应用程序中连接到我的 IdentityServer 的登录表单。

每个客户都有自己的 Angular SPA 子域(例如 x.myapp.com)。因此,我可以轻松地将 X 的用户重定向到他们服务器的授权页面,以根据主机名批准我的 API。

但是 API 本身对所有客户使用一个通用主机名 (api.myapp.com)。客户在登录调用(和其他一些不受保护的调用)期间通过 API 调用 (x.myapp.com) 的来源 header 以及对 API.

  1. 我的 API 如何检查 Bearer 访问令牌?谁应该知道查询哪个服务器? 是API服务器的责任吗?或者我可以告诉我的 IdentityServer 关于 X 的 oauth2 服务器吗?

  2. X 的用户也将在我的平台上定义,因为我们需要特定信息(例如平台上的角色配置)。我当前的设置暗示了允许我的 API 知道用户可以做什么的特定声明(例如用户 ID)。显然,X 的服务器不会提供相同的声明。我怎样才能连接点?例如从 X 的服务器(用户名、电子邮件等)获取一些标准声明并将其与我的用户列表匹配。

注意:This question类似但答案未被接受,似乎暗示两个身份服务器的提供者是相同的(这里不是这种情况)。

将我的评论格式化为答案:

通过阅读您的问题,我很清楚您可以从所谓的 Federated identity.

中受益

正如您所说,您的一位客户想要实现 SSO - 他们希望用户使用他们现有的帐户登录并能够正常使用您的系统。

由于您的域中已经有一个 IdentityServer,您可以做的是委托 将登录部分委托给客户(无论他们做什么)。这在身份服务器文档 Federation Gateway.

中进行了说明

基本上,方法是在点击前端的“登录”按钮后,将用户重定向到您的身份服务器,传递一些特殊参数(promptacr_values例如)反过来,它告诉身份服务器将用户重定向到外部身份提供者(客户的)。成功登录后,您有机会在 Identity Server 中扩充声明,也许使用他们 returned 的东西或任何真正的东西。然后这个过程就正常了——你 return 一个由 你的身份服务器

生成的 JWT 令牌

这样做的好处是:

  • 您的 SPA/API 不必更改。您仍将使用自己的不记名令牌,并可以像以前一样继续 authN/AuthZ。
  • 您有机会添加可能表明该用户来自何处的声明如果需要
  • 如果您客户的服务器发生变化,您不必太担心,除了可能与 returned claims
  • 相关的一些调整
  • 他们不一定需要在他们这边使用 OpenId/OAuth 才能工作

您可能需要的有用的东西是在调用 authorize endpoint in Identity Server 期间传递的一些参数。 (acr_valuesprompt)。

您还可以通过查看 Sign-in with external providers(这与您想要的非常相似)

在快速入门中进行检查

现在开始你的个人积分:

  1. 您的身份服务器应该是您与客户的“身份提供者”之间的“桥梁”。

  2. 从外部提供商 (X) 登录后,您需要以某种方式识别您平台上的用户。您可以使用 email 或者更好,如果 X 已经在使用 OpenId/OAuth 他们可能会给您 sub 声明,这是他们这边的用户 ID。此时你需要与他们达成某种协议,否则双方可能 flaky/unreliable。

在更“高级的说明”中,您还可以向您的令牌添加某种声明,告诉您谁是该用户的 source provider。这里的源提供者将是 X。这很有用,因为您可能想要,例如,在您的应用程序中配置允许的身份提供者,或者可能仅为某些提供者启用功能。例如,使用 Google 登录的人可能只能看到应用程序的某些部分。