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

问题描述

  • 客户类型:水疗中心
  • 授予类型:隐式或代码(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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...