如何绕过Keycloak登录表单,直接跳转到IDP登录?

Posted

技术标签:

【中文标题】如何绕过Keycloak登录表单,直接跳转到IDP登录?【英文标题】:How to bypass Keycloak login form and jump directly to the IDP login? 【发布时间】:2018-03-05 13:25:20 【问题描述】:

我正在运行saml-broker-authentication 示例。我在 UI 中看到的第一件事是用户/通行证,可以选择使用代理(下图)。

有没有办法跳过这个表格直接去找 IDP?

点击其中一个 IDP 后,我得到一个 URL:http://localhost:8080/auth/realms/saml-broker-authentication-realm/broker/sanity-idp/login?client_id=saml-broker-authentication&code=<keycloak generated>

我尝试直接使用以下网址(不含代码),但出现错误。 (http://localhost:8080/auth/realms/saml-broker-authentication-realm/broker/sanity-idp/login?client_id=saml-broker-authentication)

知道如何绕过 Keycloak 身份验证并通过 SP(代理)直接进入 IDP 吗?谢谢。

更新:我的 TL 找到了一个静态解决方案,将 IDP ID 放在浏览器的身份验证流程中,在 Identity Provider Redirector 执行下。但是,我们正试图找到一种动态的方式来做到这一点。查看了kc_idp_hint documentation,但找不到使 saml-broker-authentication 示例与它一起工作的方法:(

【问题讨论】:

邮件列表:lists.jboss.org/pipermail/keycloak-user/2017-October/… 我有一个类似的任务,但用于用户身份验证。我不确定它是否有帮助。以防万一github.com/v-ladynev/… 【参考方案1】:

为了通过 Keycloak 代理重定向到 IDP 登录页面,您可以使用以下 URL:http://localhost:8080/saml-broker-authentication/

【讨论】:

【参考方案2】:

正如您所提到的,您可以通过为整个领域设置默认身份提供者来绕过 Keycloak 屏幕并直接进入 IdP:

可以自动重定向到身份提供者而不是显示登录表单。要启用此功能,请转到管理控制台中的 Authentication 页面并选择 Browser 流。然后单击 Identity Provider Redirector 身份验证器的配置。将默认身份提供者设置为您希望自动将用户重定向到的身份提供者的别名。

(https://www.keycloak.org/docs/latest/server_admin/index.html#default_identity_provider)

不幸的是,这是针对整个领域的,不能动态设置或按 SP 设置。 kc_idp_hint 似乎是解决方案,但它仅适用于 OIDC:

OIDC 应用程序可以通过指定他们想要使用的身份提供者的提示来绕过 Keycloak 登录页面。

这是通过在授权代码流授权端点中设置kc_idp_hint 查询参数来完成的。

(https://www.keycloak.org/docs/latest/server_admin/#_client_suggested_idp)

似乎有一个功能请求添加 kc_idp_hint 对 SAML 的支持,但仍未解决:

https://issues.jboss.org/browse/KEYCLOAK-4884

作为一种解决方法,您可以创建一个新领域并为该领域设置默认身份提供者。这样,如果您的 SP 需要代理到不同的 IdP,您可以将它们设置在适当的领域中。

缺点是每个领域都充当自己的 IdP,因此它有自己的实体 ID、公钥等。您实际上必须每次都重新设置 SP,使其默认为不同的 IdP。

【讨论】:

【参考方案3】:

要将身份提供者设置为默认的忽略 keycloak 登录表单,只需转到身份验证菜单 > 身份提供者重定向操作链接 > 将默认身份提供者设置为您想要的提供者的别名。从浏览器 localhost:8080/realm[...]/account 打开后,您将被自动重定向到您的提供商登录页面。

【讨论】:

这可行,但它适用于整个领域。问题的作者想要一种动态地做到这一点的方法:“但是,我们正在尝试找到一种动态的方法来做到这一点。”【参考方案4】:

在搜索了很多之后,我设法用这行代码做到了:

keycloakAuth.login(idpHint: 'facebook');

keycloakAuth 是:

keycloakAuth = Keycloak(
    url: environment.keycloakRootUrl,
    realm: 'realm',
    clientId: 'client-id',
    'ssl-required': 'external',
    'public-client': true
);

无需将其设置为默认身份提供者

【讨论】:

我们应该在哪里写这段代码?它是 SPI 还是任何 javascript 政策的一部分。你能分享更多的细节。您的代码看起来很有希望,但不清楚该代码的放置位置。 我正在编写一个角度应用程序。每当用户单击按钮登录时,都会触发我回答的第一个代码。第二个代码在服务上。加载应用程序时,它使用我答案的第二个代码中的值设置变量“keycloakAuth”。被实例化的类“Keycloak”是一个 javascript (keycloak.js) 代码,keycloak 可以从其安装中获取。 这个问题是特定于 SAML 的。这适用于 SAML 吗?例如,Facebook 不使用 SAML,而是使用 OIDC。 您使用了什么包或库 url 以便能够创建实例 keycloakAuth【参考方案5】:

这是一个旧帖子,但对于某人来说可能仍然是真实的。

    对于在 keycloak 管理面板中设置的身份提供者登录页面上的静态重定向,将名称从 Identity Providers -> name 设置为 Authentication -> Identity Provider Redirector -> config -> Default Identity Provider。之后,对https://KK/realms/RM/protocol/openid-connect/auth?... 的请求会将您重定向到身份提供者,例如脸书

    动态选择 idp。如果您不会进入 idp 登录页面,您可以在 KK 中添加额外的参数 kc_idp_hint,例如

// go to KK login page with username/pass and choice of idp provider
https://KK/realms/RM/protocol/openid-connect/auth?...&kc_idp_hint

// go to facebook login page if facebook idp is cinfigure 
https://KK/realms/RM/protocol/openid-connect/auth?...&kc_idp_hint=facebook

// go to other login page
https://KK/realms/RM/protocol/openid-connect/auth?...&kc_idp_hint=other

【讨论】:

问题是针对 SAML。不幸的是,kc_idp_hint 似乎仅适用于 OIDC 客户端,您可以从答案的 URL 中看到,因为它们包含 openid-connect【参考方案6】:

您还可以在 IdentityProviderAuthenticator 类之上扩展和编写新的身份验证器 spi,其中身份验证根据请求 url 属性执行重定向()。

否则大多数情况下,资源 url 中的 kc_idp_hint 会有所帮助。

E.g https://resourceserver/resourcepath?kc_idp_hint=google

【讨论】:

您好 Sundar Rajan,您能否分享一个自定义 IdentityProviderAuthenticator 的示例,因为我计划自己实现用户联合以进行基本电子邮件验证,但对于身份验证,我需要依赖在领域下配置的多个 IDP .【参考方案7】:

为了跳过 SSO,首先 keycloak init 然后传递 idp_hint 来登录。

 const options: KeycloakLoginOptions = 
      idpHint: ' ',
    ;
    keycloak.init().then(() => 
      keycloak.login(options).then(() => 
        onSuccess();
      );
    );

【讨论】:

Athena,能否请您也链接到文档?谢谢。 没有文档,我只是看了keycloak-js的源码。【参考方案8】:

kc_idp_hint 将与 SAML 一起使用,方法是传递 IDP 别名而不是 IDP 显示名称。

【讨论】:

通过使用 JavaScript 适配器我们可以编写 keycloakAuth.login(idpHint: 'idp_alias');

以上是关于如何绕过Keycloak登录表单,直接跳转到IDP登录?的主要内容,如果未能解决你的问题,请参考以下文章

selenium:python如何绕过登录页面登录网页

Keycloak 与 IDP 和 SSO 的集成

在 keycloak 中,如何使用 kc_idp_hint 重定向到 IDP?

织梦DedeCMS会员登录或退出后如何直接跳转到首页

如何从外部 IDP 读取/导入角色到 Keycloak

反应:在重定向到 Keycloak IDP 页面之前阻止显示应用程序