CSRF令牌未从Angular发送到Spring

时间:2017-11-27 11:24:23

标签: spring angular security spring-boot csrf

我们正在使用Angular和Spring Boot构建Web应用程序。作为我们的安全措施之一,我们使用CSRF令牌。问题是,在我们的本地计算机上,令牌验证有效,但在我们的登台服务器上,令牌不会由前端发送。这个问题突然发生了;在使用令牌的头几个月里,我们没有遇到这个问题。经过一定的构建,他们开始失败。过了一会儿,他们再次工作,但现在又停止了工作。

因此,似乎存在我们未能看到的环境问题。

我们可以看到什么

Spring正在创建CSRF令牌并在预检(OPTIONS)请求中发送它。它将令牌封装在Set-Cookie标头中,Angular使用CookieXSRFStrategy进行读取。同样,在本地这可以正常工作,但在我们的登台服务器上,这会失败。问题是Angular在收到令牌后没有设置cookie。我们通过检查Google Dev Console中的Cookie来检查这一点。

Spring给出的具体错误是:

  

在请求参数' _csrf'上找到了无效的CSRF令牌。要么   标题' X-CSRF-TOKEN'

导致此问题

我们无法登录,因为Spring没有收到CSRF令牌。因此,除非我们完全关闭CSRF保护,否则我们无法对应用程序执行任何操作。

我们尝试了

  • 将Chrome中的应用程序专门列入白名单。
  • 清除Cookie和缓存。
  • 在不同的机器上尝试不同的浏览器。这种情况发生在Chrome,IE11和Firefox中。我们还没有尝试过任何其他浏览器。
  • 确保通过CORS允许原点,即它。我们使用Access-Control-Allow-Origin标头执行此操作。
  • 使用Access-Control-Expose-Headers标头公开更多标头,例如Set-Cookie。这并没有改变任何事情。
  • 使用Access-Control-Allow-Headers允许更多标头。这也没有任何改变。
  • 使用cURL模拟登录过程(使用Postman应用程序)。这有效。因此,Angular无法正确处理令牌的问题。
  • 使用JavaScript / TypeScript手动读取标题。由于标题没有暴露,这似乎没有用。
  • 在努力解决这个问题后,我们决定整合Docker,以反映我们的舞台和本地环境。这并没有解决问题。
  • 恢复到以前的版本也没有工作。

重要说明

  • 在本地和登台环境中,我们都使用SSL证书。在本地,我们使用自签名证书。
  • 所有应用程序都在Wildfly服务器上运行。 Angular和Spring代码都是使用Wildfly部署的WAR文件构建和分发的。
  • 我们正在使用公司代理。登台服务器由内部托管,只有当您在公司网络上时才能访问。

版本

  • Angular:4.2.2
  • Spring Boot:1.4.1
  • Wildfly:10.1.0.Final

我们目前的解决方法是完全禁用CSRF保护,以便在寻找解决方案时能够继续开发。

有没有人知道会出现什么问题?

1 个答案:

答案 0 :(得分:0)

传递无效的 CSRF令牌时,在请求参数'_csrf'或标题'X-CSRF-TOKEN'上发现无效的CSRF令牌。如果Spring根本没有收到任何CSRF令牌,它将打印另一条消息“无法验证提供的CSRF令牌,因为找不到会话”。这意味着前端正在发送旧的或无效的CSRF令牌。

  1. 您的公司网络代理可能会应用一些登录机制并覆盖您的X-CSRF-TOKEN标头。

  2. 根据Spring Security documentation,需要cookieHttpOnly = false才能允许AngularJS读取XSRF-TOKEN cookie。