是否可以在不重定向到外部登录页面的情况下进行SPA身份验证

Art*_*zzo 7 authentication single-page-application openid-connect identityserver3 identityserver4

我目前正在开发一个连接到一堆webAPI的SPA应用程序.这些API要求用户登录,因此我开始深入研究Openid Conect和OAuth2示例,主要使用IdentityServer.

出于SPA原因,它们都需要使用隐式授权来检索access_tokens.处理令牌刷新使用隐藏的iframe连接到身份验证服务器.

我从这种方法中理解的是,更新access_token是在会话中维护身份验证服务.隐藏的iframe进入身份验证服务器,会话仍处于活动状态,提供了新的access_token.

所有这些对我来说都很好,除了(对于UX reasosn)我的用户需要被重定向到身份验证服务器页面以提供凭据.

是不是可以让我的SPA应用程序向身份验证服务器发送凭据,获取access_token,然后使用隐藏的iframe进行刷新以进行静默续订(我们显然不希望用户每隔15分钟或每小时继续通知凭据..).

如果出于安全原因这是不可接受的,您能解释一下原因吗?

Kar*_*hik -2

编辑: 编辑此答案以正确反映要求。

如果要求不显示身份验证服务器页面并使用您自己的 SPA,则唯一可能的方法是使用“资源所有者密码流”以及前面答案中提到的约束

不鼓励这样做有两个原因:

  • 安全性- SPA 在处理用户密码时是否具有与“身份验证服务器”相同的安全控制。从收集到管理用户密码(确保将来的通话安全?)。这将极大地影响 SPA 的范围,也是人们更喜欢联合登录的主要原因之一(将登录复杂性外包给第三方 - 在您的情况下是身份验证服务器)
  • 信任- 您如何说服用户将“身份验证服务器”密码分发给相对较新的 SPA 应用程序。想象一下,如果 Google / Facebook 允许 SPA 采用这种模式来收集密码,而不是重定向到 Google / Facebook 登录页面。这是灾难的根源。

这正是 oidc-client-js 库所做的。查看其 wiki 页面中的automaticSilentRenew设置。可以理解的是,只有当身份验证服务器上的会话仍然处于活动状态时,这才有效。

  • 使用oidc-client-js库不需要使用ImplicitFlow?据我了解,使用这种流程需要将用户重定向到 IdentityServer 托管的登录页面。我试图实现一种可以在 Angular 应用程序中输入用户/密码的行为。 (2认同)