能否实现SPA身份验证而无需重定向到外部登录页面?

11

我目前正在开发一个连接到一堆WebAPI的SPA应用程序。这些API要求用户登录,因此我开始查阅Openid Connect和OAuth2示例,主要使用IdentityServer。

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

我对更新访问令牌的方法理解是,会话在认证服务中保持。隐藏的iframe跳转到认证服务器,会话仍然活动,提供新的访问令牌。

这一切看起来对我来说都很好,除了(出于UX方面的考虑)我的用户需要被重定向到认证服务器页面以提供凭据之外。

难道不能让我的SPA应用程序直接将凭据发送到认证服务器,获取访问令牌,然后使用隐藏的iframe进行静默续订(显然我们不希望用户每15分钟或每小时都要输入凭据..)吗。

如果出于安全原因不允许这样做,请解释一下原因。

2个回答

1

从技术上讲,使用“资源所有者密码流”是可能的,但在该模型中,身份提供商无法信任您的应用程序,并且不会为您的用户创建会话(以便稍后使用静默更新)。因此,这种非交互式方法并不真正实现SSO。
对于2019年的任何Web应用程序(如Angular SPA),建议使用Code flow with PKCE扩展作为流程,如此处那里所述。


-2

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

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

这有两个原因不鼓励使用:

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

这正是oidc-client-js库所做的事情。请查看他们维基页面中的automaticSilentRenew设置。可以理解的是,只要身份验证服务器上的会话仍然活动,这才能起作用。


2
使用oidc-client-js库不需要您使用ImplicitFlow吗?据我所知,使用这种流程需要将用户重定向到IdentityServer托管的登录页面。我试图实现一种行为,在其中可以在Angular应用程序中输入用户名/密码。 - Arthur Rizzo
您仍需要使用oidc-client-js的隐式流。当用户首次尝试访问受保护的SPA时,用户将被提示进行身份验证。对于后续的Access-Token到期,库将启动静默访问令牌更新调用(即,在当前令牌到期前几秒/分钟请求新的访问令牌)。因此,每次访问令牌过期时,用户不会被提示进行身份验证。在SPA中存储用户凭据/客户端凭据是不安全的,因为它们会公开暴露。 - Karthik
用户将被提示进行身份验证,这听起来像是用户将被重定向到身份提供者的登录页面,而这正是问题作者似乎试图避免的。 - Wereii
同意!忽略了需求 - 感谢您指出。 - Karthik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接