我在单独的机器上使用没有静态内容的 Asp.Net Core Webapi 2 作为后端服务器 + nginx 来服务 Angular 7 应用程序。问题来了:尝试使用 xrsf 防伪保护是否有意义,例如
services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");
在前后分离机器的情况下?据我了解,我必须管理这两个服务器之间的某种状态,以从 Nginx 提供相应的 cookie,后端服务器将接受该 cookie。
1 回答
如果我正确理解了这个问题,你想知道如何保护你的 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 静态文件不可见。但是,您可以通过以下方式之一解决此问题:
如果您的 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
如果您的 Web API 服务器和静态文件服务器使用不同的子域(webapi.example.com 和 static.example.com)访问,您可以使用上述方法或在设置 cookie 时设置域:
Set-Cookie: name=value; domain=example.com
你也可以考虑为 CSRF阅读这个线程