XSRF 防伪:Asp.Net Core 2 WebApi(不是 MVC)+ Angular 的单独服务器是可能的吗?

XSRF antiforgery: Asp.Net Core 2 WebApi (not MVC) + separate Server for Angular is possible?

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

如果我没理解错的话,你想知道如何保护你的webapp免受CSRF攻击。

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

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

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

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

  1. 如果您的网络 API 服务器和静态文件服务器使用不同的 IP(例如 172.168.1.1 和 172.168.2.2)或不同的域(例如 webapi.com 或 static.com),需要配置webapi服务器设置如下header响应,允许静态文件服务器(172.168.2.2或static.com)读取cookies : Access-Control-Allow-Origin: https://static.com

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

您也可以考虑阅读 this thread for CSRF