当前位置: 首页 > 知识库问答 >
问题:

密钥斗篷:外部IdP的SAML响应无效

曹子平
2023-03-14

我正在使用SAML和外部IdP实现SSO选项。如果我在单击浏览器中的SSO按钮后检查收到的SAML响应,我可以看到所需的身份验证数据(如用户名和电子邮件),因此与IdP的通信工作正常。

然而,Keycloak并不执行登录,并显示给我一个页面,上面写着:“我们很抱歉...登录超时,请重新登录。”,并且没有新用户注册。我的领域中令牌的登录超时设置为30分钟。

查看日志时,我发现了以下错误:

keycloak_1  | 00:38:27,888 ERROR [org.keycloak.broker.saml.SAMLEndpoint] (default task-26) Assertion expired.
keycloak_1  | 00:38:27,889 WARN  [org.keycloak.events] (default task-26) type=IDENTITY_PROVIDER_RESPONSE_ERROR, realmId=master, clientId=null, userId=null, ipAddress=172.20.0.1, error=invalid_saml_response

我发现这可能是由于IdP和SP中的EntityID不同,但我联系了我的IdP,EntityID相同。

可能是什么问题?

共有3个答案

卢雅惠
2023-03-14

这可能是Keycloak主机的时钟和IDP主机的时钟之间的差距太大的问题。

如果是这种情况,则可以通过在Keyclock中的IDP配置页面上设置“允许的时钟偏移”参数来解决。

如果每个主机的时钟之间的间隔为 x 秒,请将“允许的时钟偏差”设置为至少 x。

邬楚青
2023-03-14

显然,问题是,当计算机处于待机状态时,docker容器的内部日期停止更新,因此这在docker容器上的服务提供商的过期日期和身份提供商的真实日期之间产生了差异。只需重新启动docker即可解决问题。

赖杰
2023-03-14

通常,SAML响应无效。它可以是任何东西:错误的实体ID、错误的时间、错误的签名/加密签名、…

代码参考

 类似资料:
  • 我有一个需要联合到IDP的需求。我过去从未遇到过问题,在这种情况下,我遇到了问题,因为第三方/外部IDP启用并实施了PKCE。 有没有办法联合到启用了PKCE的IDP。基本上换句话说,我应该能够转发/发送code_challenge和code_challenge_method给外部 IDP。我可以在我的 IDP 上启用 PKCE,而不会出现任何问题,并在需要时将相同的标头转发给外部 IDP,但我看

  • 我正在我的应用程序(app1)中使用KeyClope(版本8.0.1)作为身份代理。在我的应用程序中,用户可以使用外部idp(谷歌、fb)或从我们的登录页面进行签名。现在,我设置了另一个keyclope实例,并使用OIDC将其配置为IDP。它工作得很好。 如果用户已准备就绪,请登录外部idp(谷歌、fb),并从app2的网页上单击我的应用程序(app1)。有没有办法,我可以自动让用户进入,而不是将

  • 我的问题在这一点上更理论化。 我有一个用例,我必须将我的应用程序(App 1)与Keycloak集成,并将Keycloak与外部身份提供者集成。在这种情况下,奇克洛只是一个经纪人。该外部IDP上还注册了其他应用程序。 场景1:用户既没有登录App 1,也没有登录IDP 当用户尝试访问App 1时,它最终被重定向到外部IDP登录表单并发布身份验证,它将被重定向回应用程序。这是一个简单的流程。 场景2

  • 我正在尝试编写一个定制的KeyClope验证器,该验证器可以从某个请求中检索用户凭据,并动态提交这些凭据进行身份验证,而最终用户不必手动将它们输入某个登录表单。 以这个问题为起点,我在KeyCloak中创建了自己的自定义身份验证SPI。我还根据需要配置了KeyCloak身份验证流。 自定义验证器 自定义验证器工厂 下面是我的自定义登录表单,它基于这里的KeyClope“secret questio

  • 我试图使用Keycloak的openId-connectendpoint来获取关于用户角色的信息。我使用/auth/realms/moje/protocol/OpenID-connect/userinfoendpoint来获取关于已验证用户的信息。我可以获得姓名、用户名、电子邮件等信息。但是我不能强迫Keyclak给我关于用户角色的信息。 我已经阅读了openID文档,我没有找到任何关于必须获取角

  • 我想设置一个Docker网络,其中包含keyCloak、postgres和webapp实例。 有没有一种方法可以在容器之间进行网络通信,同时也理解oidc客户端重定向?我有一个问题,容器可以互相交谈只是罚款,如果我设置OIDC容器名称为docker网络,但然后我遇到的问题与客户端,不能连接到这些相同的URL以外的docker网络在主机上机器。 有人能给我指出正确的docker留档来寻找DNS或主机