问题描述
- 客户类型:水疗中心
- 授予类型:隐式或代码(pkce)
作为用户,如果我已经使用身份提供者登录,则希望能够进行静默身份验证。如果不像来宾用户一样留在客户端。而且,如果我要登录到客户端,则应该可以通过登录页面手动进行身份验证。
这具有手动登录和自动登录方案。您将如何在Open ID Connect中处理此类情况?
如果用户具有有效的会话,则在客户端设置中添加prompt=none
会静默获得新令牌。但是,如果不是这样,我希望用户能够按照他/她的意愿通过登录页面进行手动身份验证。
如果我设置了prompt=none
,则它将永远不会进行任何用户交互,例如身份验证。
标签:静默认证oidc,自动登录,SSO
解决方法
这是一个很深的主题,流程通常是这样的:
经典OIDC解决方案
- 为每个SPA重定向用户
- 如果已经在IDP上登录,则没有登录提示
- OAuth状态存储在本地存储中(尽管建议仅将实际令牌存储在内存中)
- 当访问令牌到期时(或之前),请使用提示=无将iframe令牌续签
- 打开新的浏览器标签后,请进行iframe令牌更新以获取该标签的令牌-以避免完全重定向
- 用户注销后,从本地存储中删除OAuth状态
使用最广泛的库是OIDC Client,它将为您完成很多艰苦的工作。另请参阅我的blog post + code sample,以了解外观。
问题领域
还值得注意的是,默认情况下,2020年Safari浏览器中的iframe静默更新默认情况下不起作用。有关此here的一些注意事项。
,或者,您可以使用signinSilent()
。我已经在登录页面ngOnInit上使用了它(因为AuthGuard无论如何都会将用户重定向到登录名,所以我认为这将是我的理想选择)。
// login.ts
ngOnInit(): void {
this.authService.signinSilent().then(_ => {}).catch(_ => {});
}
// authService
public signinSilent() {
return this.userManager.signinSilent();
}
如果用户已经具有与idp的有效会话,则 signinSilent方法将返回用户对象。否则会引发错误,可能是login_required
。