OpenID Connect,如果尚未登录,则无需登录表单即可重定向?
Posted
技术标签:
【中文标题】OpenID Connect,如果尚未登录,则无需登录表单即可重定向?【英文标题】:OpenID Connect, redirect without login form if not already logged in? 【发布时间】:2018-06-26 02:59:34 【问题描述】:在 OpenID Connect 中,如果我的用户连接到身份提供者,我希望他们自动连接到我的客户端(假设他们已经授权了我的客户端应用程序)。
这是我想要的工作流程:
USER 到达 CLIENT 主页 USER 被重定向到 IdP(授权请求) 如果他已登录 IdP,他会被重定向到 CLIENT,OIDC 工作流程开始,然后他已登录 CLIENT 如果他没有登录 IdP 或者他没有授权 CLIENT 访问他的身份,则 IdP 的登录表单不会显示给 USER,他会被重定向到 CLIENT 主页,而不是登录这就像 CAS 中的“网关”模式。 我使用授权码流,我不想使用带有隐式流的 javascript 来通过 JS 动态登录。
你知道这是否可能吗?我在规范中找不到它。
谢谢:)
【问题讨论】:
【参考方案1】:您正在考虑基于 IDP 的 SSO 行为。这通常在 OpenID Connect 规范之外,并且通常绑定到您正在使用的特定身份提供程序(例如:- Azure、PING 或 WSO2)。但是有一些参数可以调整这种行为,例如 prompt 和 login_hint 是可选的。
来自 OpenID Connect authentication request section
提示
空格分隔、区分大小写的 ASCII 字符串值列表 指定授权服务器是否提示最终用户 重新认证和同意。
有效值为 login、none、consent 和 select_account。您可以使用它们强制强制登录或允许选择帐户。
login_hint
向授权服务器提示有关登录的信息 最终用户可能用于登录的标识符(如有必要)
一个很好的例子是通过将 login_hint 传递给身份提供者来启用 SSO 行为。如果身份提供者可以针对(例如)企业 LDAP 验证身份并检测登录状态,则您可以提供无凭据登录体验。同时,您可以使用 prompt=login 强制登录,即使身份提供者持有登录会话。
【讨论】:
谢谢,我完全错过了这个“提示”参数,这正是我需要的。 “none”值很棒:如果用户已登录 IdP,则自动登录,并且对已注销的用户透明。【参考方案2】:或者,您可以使用signinSilent()
。我在我的登录页面 ngOnInit
上使用了它(因为 AuthGuard 无论如何都会将用户重定向到登录,我认为这将是我场景中的完美位置)。
// login.ts
ngOnInit(): void
this.authService.signinSilent().then(_ => ).catch(_ => );
// authService
public signinSilent()
return this.userManager.signinSilent();
signinSilent
方法将返回用户对象,如果用户已经与 idp 有一个有效的会话。否则会抛出错误,可能是login_required
。
【讨论】:
这个答案是关于使用 Angular 实现 OIDC 客户端的。我的问题是关于 OIDC 规范的更笼统的问题。不过谢谢你,它可能会帮助其他人:)以上是关于OpenID Connect,如果尚未登录,则无需登录表单即可重定向?的主要内容,如果未能解决你的问题,请参考以下文章
AppAuth / OpenID-Connect:使用用户名和密码登录?
OpenID-Connect 身份验证服务器的登录页面中是不是需要 CSRF 令牌?