Keycloak导致IE无限循环

Nem*_*vic 7 javascript angularjs keycloak

我们正在使用keycloak 1.3.1身份验证库,我注意到一旦我初始化了keycloak { onLoad: 'login-required' },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');
});
Run Code Online (Sandbox Code Playgroud)

知道是什么导致它,并解决这个问题?尝试安装最新版本1.4.0,希望奇怪的bug得到解决.

提前致谢.

Fra*_*rel 14

我遇到了与keycloak v1.5.0.Final/Internet Explorer 11相同的问题,最后弄明白了发生了什么.

1.在幕后

在Keycloak的init方法中使用模式'login-required'或'check-sso'时,Keycloak Javascript Adapter会设置一个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
Run Code Online (Sandbox Code Playgroud)

它的内容是一个javascript脚本,它应该能够访问以前由keycloak在身份验证上设置的KEYCLOAK_SESSION cookie(在同一个域上http(s)://yourkeycloakhost:port).

2. IE的问题

是! 以下是Internet Explorer的问题,它具有严格的iframe和Cookie策略.实际上,keycloak IFRAME确实具备访问yourkeycloakhost由于其域的Cookie P3P政策(Microsoft Internet Explorer中是唯一的主要的浏览器支持P3P).

这个stackoverflow问题很好地描述了这个问题

3.决议

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

为此,您的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"
Run Code Online (Sandbox Code Playgroud)

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

4.结果

您可以查看keycloak的iframe代码:

var cookie = getCookie('KEYCLOAK_SESSION');
if (cookie) {
    data.loggedIn = true;
    data.session = cookie;
}
Run Code Online (Sandbox Code Playgroud)

现在yourkeycloakhostInternet Explorer正确检索域上的cookie ,问题得到解决!


yod*_*mad 5

从keycloak文档中了解到的对我有用的解决方法是checkLoginIframe在执行init方法时添加参数:.init({onLoad: 'login-required', checkLoginIframe: false})