ASP.NET Core 2.0中的防伪cookie

时间:2018-07-09 14:35:14

标签: c# asp.net asp.net-mvc asp.net-core-mvc asp.net-core-2.0

我一直在试图确切地了解反伪造的工作原理。使我感到困惑的是创建的cookie。据我了解,您在表单中包含了防伪令牌,然后在发出请求时验证该令牌。这样,如果第三方网站发布到您的网站,它将被拒绝。

现在,我在这里https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-2.1读到防伪令牌存储在cookie中,也许我读错了吗?但为什么?难道不是要不要在您的网站之外访问此值?如果查看Cookie,我会看到3个以伪造名称创建的Cookie。

services.AddAntiforgery(options => 
{
    options.CookieDomain = "contoso.com";
    options.CookieName = "X-CSRF-TOKEN-COOKIENAME";
    options.CookiePath = "Path";
    options.FormFieldName = "AntiforgeryFieldname";
    options.HeaderName = "X-CSRF-TOKEN-HEADERNAME";
    options.RequireSsl = false;
    options.SuppressXFrameOptionsHeader = false;
});

我做了一些测试,创建了一个邮寄表格,最终包含了防伪令牌,然后我尝试将其提交并成功了。然后,我创建了另一个没有令牌的表单,但失败了。所以在我看来,它似乎只查找在表单中传递的令牌,然后Cookie的作用是什么?

2 个答案:

答案 0 :(得分:4)

反伪造是一个分为两部分的过程。生成页面时,令牌将作为表单的一部分包括在内,以便将其与您的其余数据一起发布。 cookie是针对事物的客户端设置的。发布后,客户端将带有发布数据(包括令牌) 的请求发送给服务器,并将cookie发送回服务器,服务器也包含令牌。在服务器端,发布的令牌与cookie令牌匹配,如果两者不匹配,则拒绝。

这似乎很奇怪,因为客户端同时发布了这两个消息,但是cookie部分确保了获得该页面的同一客户端也是发回该页面的同一客户端。目的不是要保护反伪造令牌,而是要确保您网站上的页面是已提交的页面,而不是某些诈骗者重新创建的页面版本。由于第三方无法为您的域设置Cookie,因此即使他们能够通过请求并解析令牌从页面中检索有效令牌,也无法伪造这部分支票。

答案 1 :(得分:0)

来自asp.net核心网站AntiforgeryOptions.Cookie Property。仅当使用基于cookie的身份验证时,才需要CSRF的cookie部分。

  

防伪系统使用的cookie是安全系统的一部分,在使用基于cookie的身份验证时必不可少。