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

标签 angular asp.net-core asp.net-core-2.0 csrf x-xsrf-token

我使用没有静态内容的 Asp.Net Core 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 应该是安全的,但可以使用 javascript 读取(非httpOnly)。您可以将 cookie 的值设置为用户 session 唯一的值(最好是加密生成的随机数)。在这里,在每个后续请求中,Angular HttpClient 将在请求 header X-XSRF-TOKEN 中发送 cookie 值,并且服务器需要验证 cookie 值和请求 header 值正确。请注意,访问 token cookie 也会伴随请求(与基于 token 的身份验证一样)。因此,在每个有效的 API 调用中,您的 Web 服务器将在 cookie header 中接收访问 token ,并在自定义 XSRF header 和 XSRF cookie header 中接收 XSRF cookie 值。如果缺少 XSRF header 或值不匹配,服务器将拒绝请求。

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

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

  1. 如果您的 Web API 服务器和静态文件服务器使用不同的 IP(例如 172.168.1.1 和 172.168.2.2)或不同的域(例如 webapi.com 或 static.com)访问,您需要配置 Web api 服务器设置以下 header 以响应允许静态文件服务器(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

您也可以考虑阅读 this thread对于 CSRF

关于angular - XSRF antiforgery : Asp.Net Core 2 WebApi(不是 MVC)+ Angular 的单独服务器是可能的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53780426/

相关文章:

c# - 数据集返回意外结果的 JsonConvert.serializeObject

c# - ASP.NET Core 2.0 Identity : SignInManager. IsSignedIn(User) 登录后返回 false

Angular 4,<md-checkbox> 没有双向绑定(bind)

c# - 查看帖子表单返回null?

angular - 如何在 Angular 中将路由事件 URL 绑定(bind)到 HTML 模板中

c# - MissingMethodException DbSet.ToList 异常

ajax - 使用 AJAX 和 ASP.NET Core 登录

angular6 - "AngularCli"在 "Microsoft.AspNetCore.SpaServices"命名空间中不存在

angular - 无法绑定(bind)到 'FormGroup',因为它不是 'form' 的已知属性 ----

html - 我可以在 ngStyle 中使用 lighten css 属性吗?