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

Posted

技术标签:

【中文标题】是否可以在不重定向到外部登录页面的情况下进行 SPA 身份验证【英文标题】:Is it possible to have SPA authentication without redirecting to an outside login page 【发布时间】:2018-01-30 17:28:31 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

如果要求不显示身份验证服务器页面并使用您自己的 SPA,则唯一可能的方法是使用“资源所有者密码流”with the constraints mentioned in the previous answer

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

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

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

【讨论】:

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

技术上可以使用“resource owner password flow”,但在该模型中,身份提供者无法信任您的应用程序并且不会为您的用户创建会话(稍后使用静默续订)。因此,这种非交互式方法并不是真正的 SSO。 对于 2019 年,任何 Web 应用程序(例如 Angular SPA)的推荐流程是带有 PKCE 扩展的代码流程,如 here 或 there 所述。

【讨论】:

以上是关于是否可以在不重定向到外部登录页面的情况下进行 SPA 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

ASP NET API - 在不打开 Microsoft 登录页面的情况下使用 Azure AD SAML 协议对用户进行身份验证

是否可以在不使用 WooCommerce 重定向到 PayPal 网站的情况下进行 PayPal 付款?

您可以在不重定向的情况下使用 Passport 进行身份验证吗?

条件满足后,私有路由不重定向

如何在不重定向的情况下从数据库实时更新赞成票和反对票数?

如何在不重定向原始 URL 的情况下获取短 URL 服务的信息或实际信息