ASP.NET Core 2.0 中的防伪 cookie

Boj*_*jan 6 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;
});
Run Code Online (Sandbox Code Playgroud)

我做了一个小测试,我创建了一个帖子表单,最终包含防伪令牌,然后我尝试提交它并且它起作用了。然后我创建了另一个没有令牌的表单,然后它失败了。所以对我来说,它似乎只查找表单中传递的令牌,那么 cookie 是做什么用的?

Chr*_*att 6

防伪是一个由两部分组成的过程。生成页面时,令牌将作为表单的一部分包含在内,因此它将与您的其余数据一起发布。cookie 是为客户端设置的。当柱制成,客户端发送与所述柱数据的请求(包括令牌)其发送该cookie返回到服务器,其中还包括该令牌。服务器端,发布的令牌与 cookie 令牌匹配,如果两者不匹配,则拒绝。

这可能看起来很奇怪,因为客户端同时发布两者,但 cookie 部分确保获取页面的同一客户端也是将其发回的同一客户端。目标不是保护防伪令牌,而是确保您网站上的页面是提交的页面,而不是某个骗子重新创建的页面版本。由于第三方无法为您的域设置 cookie,因此他们无法伪造检查的这一部分,即使他们能够通过请求并解析令牌从您的页面检索有效令牌。