在ASP中使用防伪cookie.. NET Core,但使用非默认的CookieName



我正在考虑更改ASP中默认防伪造cookie的名称。网络核心。

我想更改cookie名称的原因是为了匿名化cookie,在我看来,最终用户没有理由能够确定此cookie的责任。

Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName

  1. 如何更改防伪cookie的名称?我想它应该在Startup.cs文件中以某种方式完成?
  2. 更改默认防伪造cookie的名称可能会产生什么影响?
  3. 如何在ASP中使用防伪cookie ?网络核心?
  4. 不同的web应用程序(使用相同的域)应该共享一个防伪造cookie,还是应该为每个web应用程序创建单独的防伪造cookie ?

您可以在Startup.ConfigureServices中设置不同的名称,如:

services.AddAntiforgery(opts => opts.CookieName = "MyAntiforgeryCookie");

对于。net Core 2.0.0或更高版本,将会有更改:

参考:https://learn.microsoft.com/en us/dotnet/api/microsoft.aspnetcore.antiforgery.antiforgeryoptions?view=aspnetcore - 2.0

用于下列用途:

services.AddAntiforgery(opts => opts.Cookie.Name = "MyAntiforgeryCookie");

默认情况下,AddMvc()内部调用AddAntiforgery(),这意味着您获得默认的cookie,头部和表单名称。如果您需要/想要使用不同的名称,您可以通过如上手动调用AddAntiforgery来实现。

如果您更改了cookie名称,应该不会对您的应用程序产生任何影响(除非您自己添加了手动使用该cookie的代码)。你可能还想更改头/表单名称,例如,官方的Antiforgery repo有一个使用Angular的示例,并将头更改为标准的Angular XSRF令牌头。

为了使用它,将[ValidateAntiForgeryToken]添加到除GET请求以外的控制器操作中。

你不需要为标准的html表单做任何事情,只要你使用asp表单标签帮助器,参见这个问题。

如果使用ajax请求,则需要在请求中包含包含生成的令牌的头或字段。你基本上需要:

  1. 获取IAntiforgery
  2. 呼叫var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
  3. 让它可用到你的js代码,所以它知道关于值tokenSet.RequestToken被包括作为一个字段名称tokenSet.FormFieldName或标题名称tokenSet.HeaderName在每个ajax请求。

    • 有几个选项,比如在JS布局的脚本部分中将令牌渲染成JS对象,添加JS可读cookie(如angular示例),继续渲染ajax请求中包含的隐藏字段
    • 这个答案中有一个很好的选项概述

目标是POST/PUT/DELETE/PATCH请求包含2件事:

  • 防伪cookie
  • 带有令牌
  • 的字段/报头

因此防伪中间件可以验证不存在XSRF。


更新cookie名称/域名

合理的默认值是每个应用程序都有自己的cookie。您通常使用默认方法来获得,因为没有在cookie上特别设置域,因此cookie从请求中获取域。这将意味着不同的应用程序使用不同的cookie,除非应用程序托管在相同的域。

  • 阅读更多关于cookie的工作原理

你可能只希望在特殊情况下共享cookie,例如,如果你有两个应用程序,其中应用a中的表单发送到应用b。在这种情况下,确保你使用的域名/子域名匹配两个应用程序,并使用相同的cookiea名称。

  • 点击这里阅读更多关于XSRF的信息

最新更新