Spring Security 页面无法在 Chrome 上的 Iframe 中打开

Posted

技术标签:

【中文标题】Spring Security 页面无法在 Chrome 上的 Iframe 中打开【英文标题】:Spring Security Pages don't open in Iframe on Chrome 【发布时间】:2020-07-04 17:12:46 【问题描述】:

我正在使用 SpringBoot、springsecurity 和 jdk 1.8。当我尝试在 Chrome 上的 iframe 中打开任何安全的 thymleaf 页面时,它每次都会将我重定向到登录页面。它在 Firefox 和 IE 上运行良好。当我尝试在没有 iframe 的情况下打开相同的 URL 时,它工作正常。我已经给了很多时间来解决,但可以解决它。以下是我的 spring security conf 文件代码。两个域的另一件事是不同的。

@Override
    protected void configure(HttpSecurity http) throws Exception 
        http
                .headers()
                .frameOptions().disable()
                .and()
                .csrf().disable()/*disbaling csrf here*/
                .authorizeRequests()
                .antMatchers("/","/login","/css/**", "/js/**", "/fonts/**","/img/**").permitAll()/*do not use spring security on this path*/
                .and()
                .formLogin()
                .successHandler(successHandler) /*after success login on web we are handling the success event*/
                .permitAll()
                .and()
                .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login/?logout") /*defining logout and login url here*/
                .permitAll()
                 /*
                 * This is for authentication failure handling
                 * */
                 http.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
                 /*Token based authentication we are handling here*/
                 http.addFilterBefore(new StatelessAuthenticationFilter(tokenAuthenticationService), BasicAuthenticationFilter.class);
                 http.addFilterAfter(new SameSiteFilter(), BasicAuthenticationFilter.class)
    

谁能帮我解决这个问题?

【问题讨论】:

你也在使用 Spring Session 吗? 不,我没有使用春季会议。 【参考方案1】:

首先,我建议您不要禁用 "X-Frame-Options" 标头并在 iframe 中使用您的应用程序。 这会带来安全风险,您可以在this answer 中了解更多信息。

现在解释您所看到的行为。 Spring Security 使用Session cookie 来存储用户的会话。 Cookie 与域相关联,因此,例如,如果有一个 cookie 与域 ***.com 相关联,那么该 cookie 将包含在对 stackoverlow.com 的任何请求中。

为了控制这种行为,cookie 还有一个名为SameSite 的属性。SameSite attribute 可以有 3 个值,NoneLaxStrict 或者可以取消设置并且没有值。 当值为None 时,它的行为如上所述(包含在所有请求中)。 当值为Lax 时,cookie 将只包含在***导航GET 请求中。

Spring Security 使用的Session cookie 没有设置SameSite 属性。 此时(2020 年 3 月),一些浏览器,如 Firefox 和 Edge,将 unset 属性与None 相同。 但是,Chrome 正在尝试将 unset 属性与 Lax 相同。 您可以在Chrome Platform Status 中阅读更多相关信息。

总之,当使用 Chrome 时,Session cookie 被视为将 SameSite 设置为 Lax。 由于在 iframe 中呈现应用程序不是***导航,因此来自 iframe 的请求中不包含 Session cookie,并且应用程序无法知道用户是否已登录。

您可以使用 Spring Session 将SameSite 属性显式设置为None。 我再次提醒您不要这样做,因为它会使您的应用程序容易受到 CSRF 和点击劫持攻击。 如果在考虑安全隐患后,您认为有必要将 SameSite 属性设置为 None,则可以通过在依赖项中包含 Spring Session 并创建 custom CookieSerializer 来实现。

【讨论】:

谢谢 Stein,我会关注这个的。

以上是关于Spring Security 页面无法在 Chrome 上的 Iframe 中打开的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security - 无法将默认登录页面更改为自定义

无法在 Spring Boot Security 中登录到我的自定义登录页面

使用spring security时无法访问jsf页面,出现403

Spring Security 3.1.4:由于anonymousUser身份验证无法访问目标页面

无法通过Spring Security中的登录页面

无法在 Spring Security 中用自定义替换标准登录表单