在 Open ID Connect 中配置静默身份验证

问题描述 投票:0回答:2
  • 客户类型:水疗中心
  • 授予类型:隐式或代码(pkce)

作为用户,如果我已经使用身份提供商登录,我希望能够获得静默身份验证。如果不留在客户端就像访客用户一样。如果我想登录客户端,我应该能够通过登录页面手动进行身份验证。

有手动登录和自动登录两种场景。您将如何在 Open ID Connect 中处理此类情况?

通过在客户端设置中添加

prompt=none
,如果用户具有有效会话,将静默获取新令牌。但如果不是,我希望用户能够根据他/她的意愿通过登录页面手动进行身份验证。

如果我设置

prompt=none
,这将永远不会有任何用户交互,例如身份验证。

标签:静默身份验证oidc、自动登录、SSO

authentication single-sign-on openid-connect oidc-client-js
2个回答
4
投票

经典 OIDC SPA 代币续订流程

原始 SPA 流程通常是这样工作的,不使用刷新令牌,而是将访问令牌存储在内存中。这为浏览器提供了合理的安全级别:

  • 用户被重定向到每个 SPA 的登录
  • 如果已在 IDP 上登录,则不会出现登录提示
  • 当访问令牌过期(或之前)时,使用
    prompt=none
  • 进行 iframe 令牌续订
  • 如果重新加载页面或打开新的浏览器选项卡,请执行 iframe 令牌更新以获取该选项卡的令牌 - 以避免完全重定向

例如,OIDC Client 库支持这种类型的行为。

前端流程的后端

但是随后引入了第三方 cookie 限制,并且 SSO cookie 可能无法从 iframe 发送(例如 Safari 浏览器会丢弃它),因此使用

prompt=none
不再可靠。此外,对浏览器中 XSS 的担忧不断增加,导致基于浏览器的应用程序的 OAuth 文档提出了建议。

这通常会导致使用应用程序级 cookie 将访问令牌传输到 API,这被认为可以更好地防御 XSS 威胁。这些 cookie 可以由 Web 后端或在与 SPA 的 Web 源相同的父站点中运行的实用程序 API 发出。

由于 cookie 在所有浏览器选项卡之间共享,因此它们可以实现您想要的可用性,而无需使用

prompt=none
。最常见的是,您提供登录和注销选项来删除应用程序级别 cookie,但也可以使用
prompt=login
在登录重定向期间强制进行新登录。


0
投票

或者,您可以使用

signinSilent()
。我在我的登录页面 ngOnInit 上使用了它(因为 AuthGuard 无论如何都会重定向用户登录,我认为这将是我的场景中的完美位置)。

// login.ts
ngOnInit(): void {
    this.authService.signinSilent().then(_ => {}).catch(_ => {});
}

// authService
public signinSilent() {
    return this.userManager.signinSilent();
}
如果用户已经与 idp 建立了有效会话,则

signinSilent 方法将返回用户对象。否则它会抛出错误,可能是

login_required

© www.soinside.com 2019 - 2024. All rights reserved.