【发布时间】:2021-07-15 21:30:02
【问题描述】:
我有一个 Angular 单页应用程序 (SPA) 与我的 ASP.NET API 通信。 API 受我自己的 Oauth2 服务器 (IdentityServer4) 保护。
我的一个客户(我们称他为 X)想要 SSO:他们在我平台上的用户将在他们的服务器上登录,而不是使用我的应用程序中连接到我的 IdentityServer 的登录表单。
每个客户都有自己的 Angular SPA 子域(例如x.myapp.com)。因此,我可以根据主机名轻松地将 X 的用户重定向到他们服务器的授权页面以批准我的 API。
但是,API 本身为所有客户使用一个通用主机名 (api.myapp.com)。客户在登录调用(和一些其他不受保护的调用)期间通过 API 调用的 Origin 标头 (x.myapp.com) 以及对 API 的受保护调用的 Bearer 令牌进行区分。
-
我的 API 如何内省 Bearer 访问令牌?谁应该知道要查询哪个服务器? 是 API 服务器的责任吗?或者我可以告诉我的 IdentityServer X 的 oauth2 服务器吗?
-
X 的用户也将在我的平台上定义,因为我们需要特定信息(例如平台上的角色配置)。我当前的设置意味着允许我的 API 知道用户可以做什么的特定声明(例如用户 ID)。显然,X 的服务器不会提供相同的声明。如何连接这些点?例如从 X 的服务器获取一些标准声明(用户名、电子邮件等)并将其与我的用户列表相匹配。
注意:This question 类似,但答案不被接受,似乎暗示两个身份服务器的提供者是相同的(这里不是这种情况)。
【问题讨论】:
-
您是否可以考虑将客户应用作为外部 OpenID 提供者?
-
我想这是一个选项。我应该问他们
-
我认为在这种情况下您应该查看的是所谓的联合网关。因此,在您的情况下,您的身份服务器是网关,您的 API 只知道来自它的令牌。然后,您的网关“连接”到所有不同的提供商(google、facebook 等)。登录后,用户将被重定向,您的网关将为该用户创建一个令牌。您的应用程序的其余部分相同。在此处查看此文档:docs.identityserver.io/en/latest/topics/federation_gateway.html
-
认为您的身份服务器是“协调者”。您甚至可以通过身份服务器上的一些特殊查询参数将用户直接重定向到他们的登录页面,这样他们就不会在那里提示登录,而只会提示他们登录。例如,my-identityserver.com/authenticate?prompt=none&acr_values=idp:customers_ip。 docs.identityserver.io/en/latest/endpoints/…
-
@jpgrassi 感谢您的 cmets。看起来这正是我正在寻找的。顺便说一句,那些 cmets 应该是我可以投票的答案 ;-)
标签: asp.net asp.net-core oauth-2.0 single-sign-on identityserver4