Keycloak导致IE出现无限循环问题

8
我们正在使用 keycloak 1.3.1 认证库,我发现一旦我使用 { onLoad: 'login-required' } 初始化keycloak,IE(11)就会出现无限循环问题...其他浏览器都工作正常。基本上我是这样做的:
keycloak.init({ onLoad: 'login-required' }).success(function(authenticated) {
    console.info(authenticated ? 'authenticated' : 'not authenticated');

    some other stuff...

}).error(function() {
    console.warn('failed to initialize');
});

任何想法是什么导致这个问题,以及如何解决?尝试安装最新版本1.4.0,希望奇怪的错误得到解决。
提前致谢。

你正在使用Angular吗?如果是,你可以尝试创建一个服务。如果不是,请从你的问题中删除“angularjs”标签。 - Joao Polo
我已将Keycloak更新至1.4.0版本,但问题仍然存在。是的,我正在使用AngularJs,并且我已将Keycloak初始化放置在头部控制器中,从中获取有关用户的数据,例如名称等,然后在需要时进行显示。 - Nemanja Milosavljevic
3个回答

15

我曾经遇到过与keycloak v1.5.0.Final / Internet Explorer 11相同的问题,最终找出了问题所在。

1. 背后的原因

当在Keycloak的init方法中使用"login-required"或"check-sso"模式时,Keycloak Javascript适配器会设置一个iframe,定时检查用户是否已经通过身份验证。

该iframe从keycloak服务器检索而来(假设是 http(s)://yourkeycloakhost:port):

http(s)://yourkeycloakhost:port/auth/realms/yourrealm/protocol/openid-connect/login-status-iframe.html?client_id=yourclientid&origin=http(s)://yourorigin

其内容是JavaScript脚本,可以访问由Keycloak在认证时(在相同的域名下,即http(s)://yourkeycloakhost:port)设置的KEYCLOAK_SESSION cookie。

2. IE的问题

没错!这就是使用Internet Explorer时遇到的问题,它对iframe和cookie有严格的策略。实际上,由于其P3P政策(Microsoft Internet Explorer是仅支持P3P的主要浏览器),keycloak iframe无法访问yourkeycloakhost域的cookie。

此问题在这个stackoverflow问题中有很好描述。

3. 解决方案

解决方案是使Internet Explorer信任我们的Keycloak域(yourkeycloakhost)以使用cookie,以便iframe能够读取KEYCLOAK_SESSION cookie值,并将其注册在其数据中。

为此,您的Keycloak服务器必须附加带有P3P信息的HTTP响应头。您可以使用Apache或Nginx代理来始终设置正确的标头。我使用了Apache和其mod_headers模块:

Header always set P3P "CP=ALL DSP COR CUR ADM PSA CONi OUR SAM OTR UNR LEG"

你可以通过W3C了解有关P3P的更多信息,或使用此P3P验证器验证您的P3P策略。

4. 后果

您可以查看keycloak的iframe代码:

var cookie = getCookie('KEYCLOAK_SESSION');
if (cookie) {
    data.loggedIn = true;
    data.session = cookie;
}

现在Internet Explorer可以正确获取域名为yourkeycloakhost的cookie,问题已经得到解决!


最终我们放弃了这个工具,所以我无法真正测试它,另外如上所述,Keycloak实现现在应该已经修复了,但是我会将其设置为被接受的答案,以表彰编写它的努力。谢谢。 - Nemanja Milosavljevic

9

我学习了Keycloak文档,发现一种对我有效的解决方法。在执行init方法时添加参数checkLoginIframe.init({onLoad: 'login-required', checkLoginIframe: false})


4

Keycloak开发者已经在1.9.3版本中修复了这个问题(@François Maturel描述了这个问题)。如需更多信息,请参见问题#2828


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接