作为用户,如果我已经使用身份提供商登录,我希望能够获得静默身份验证。如果不留在客户端就像访客用户一样。如果我想登录客户端,我应该能够通过登录页面手动进行身份验证。
有手动登录和自动登录两种场景。您将如何在 Open ID Connect 中处理此类情况?
通过在客户端设置中添加
prompt=none
,如果用户具有有效会话,将静默获取新令牌。但如果不是,我希望用户能够根据他/她的意愿通过登录页面手动进行身份验证。
如果我设置
prompt=none
,这将永远不会有任何用户交互,例如身份验证。
标签:静默身份验证oidc、自动登录、SSO
经典 OIDC SPA 代币续订流程
原始 SPA 流程通常是这样工作的,不使用刷新令牌,而是将访问令牌存储在内存中。这为浏览器提供了合理的安全级别:
prompt=none
例如,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
在登录重定向期间强制进行新登录。
或者,您可以使用
signinSilent()
。我在我的登录页面 ngOnInit 上使用了它(因为 AuthGuard 无论如何都会重定向用户登录,我认为这将是我的场景中的完美位置)。
// login.ts
ngOnInit(): void {
this.authService.signinSilent().then(_ => {}).catch(_ => {});
}
// authService
public signinSilent() {
return this.userManager.signinSilent();
}
如果用户已经与 idp 建立了有效会话,则 signinSilent 方法将返回用户对象。否则它会抛出错误,可能是
login_required
。