首页 > 解决方案 > XSRF 防伪:Asp.Net Core 2 WebApi(不是 MVC)+ Angular 的单独服务器是可能的吗?

问题描述

我在单独的机器上使用没有静态内容的 Asp.Net Core Webapi 2 作为后端服务器 + nginx 来服务 Angular 7 应用程序。问题来了:尝试使用 xrsf 防伪保护是否有意义,例如 services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN"); 在前后分离机器的情况下?据我了解,我必须管理这两个服务器之间的某种状态,以从 Nginx 提供相应的 cookie,后端服务器将接受该 cookie。

标签: angularasp.net-coreasp.net-core-2.0csrfx-xsrf-token

解决方案


如果我正确理解了这个问题,你想知道如何保护你的 webapp 免受 CSRF 攻击。

您的 API 托管在后端 Web 服务器中,而 Angular 静态内容托管在 nginx 中。

这个想法在Angular 文档中进行了解释。您需要XSRF-TOKEN在身份验证 REST 响应中设置 cookie(默认名称)。cookie 应该可以secure使用 javascript(非)读取httpOnly。您可以将 cookie 的值设置为用户会话的唯一值(最好是加密生成的随机数)。在这里,在每个后续请求中,AngularHttpClient都会在请求标头中发送 cookie 值X-XSRF-TOKEN并且服务器需要验证cookie值和请求头值是否正确。请注意,访问令牌 cookie 也将伴随请求(与基于令牌的身份验证一样)。因此,在每个有效的 API 调用中,您的 Web 服务器将在 cookie 标头中接收访问令牌,并在自定义 XSRF 标头和 XSRF cookie 标头中接收 XSRF cookie 值。如果 XSRF 标头丢失或值不匹配,则服务器拒绝请求。

因此,该解决方案是无状态的,并且通过将值存储在伴随每个请求的 cookie 中进行管理(除非您还在服务器中维护 XSRF cookie 值以进行更严格的验证)。

在您的设置中,由于同源策略,服务器设置的 cookie 对 nginx 提供的 Angular 静态文件不可见。但是,您可以通过以下方式之一解决此问题:

  1. 如果您的 Web API 服务器和静态文件服务器使用不同的 IP(例如 172.168.1.1 和 172.168.2.2)或不同的域(例如 webapi.com 或 static.com)访问,您需要配置 Web API 服务器以设置以下内容标头以允许静态文件服务器(172.168.2.2 或 static.com)读取 cookie:Access-Control-Allow-Origin: https://static.com

  2. 如果您的 Web API 服务器和静态文件服务器使用不同的子域(webapi.example.com 和 static.example.com)访问,您可以使用上述方法或在设置 cookie 时设置域:Set-Cookie: name=value; domain=example.com

你也可以考虑为 CSRF阅读这个线程


推荐阅读