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

Jon*_*nas 6 asp.net cookies asp.net-mvc asp.net-core-mvc asp.net-core

我正在考虑在ASP.NET Core中更改默认防伪cookie的名称.

我想更改cookie名称的原因是为了匿名化cookie,在我看来,没有理由为什么最终用户应该能够确定这个cookie的责任.

Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName

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

Dan*_*.G. 16

您可以在以下位置设置其他名称Startup.ConfigureServices:

services.AddAntiforgery(opts => opts.CookieName = "MyAntiforgeryCookie");
Run Code Online (Sandbox Code Playgroud)

对于.Net Core 2.0.0或更高版本,将会有更改:

参考:https: //docs.microsoft.com/en-us/dotnet/api/Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions?view=aspnetcore-2.0

对于以下用途:

services.AddAntiforgery(opts => opts.Cookie.Name = "MyAntiforgeryCookie");
Run Code Online (Sandbox Code Playgroud)

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

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

要使用它,请添加[ValidateAntiForgeryToken]除GET请求之外的控制器操作.

只要您使用asp表单标记帮助程序,就必须对标准html表单执行任何其他操作,请参阅此问题.

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

  1. 得到一个 IAntiforgery
  2. 呼叫 var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
  3. 使其可用于您的js代码,以便它知道tokenSet.RequestToken要包含在具有名称的字段tokenSet.FormFieldNametokenSet.HeaderName每个ajax请求中具有名称的标头的值.

    • 有一些选项可以将令牌转换为js布局中脚本部分内的JS对象,在角度示例中添加JS可读cookie,继续渲染包含在ajax请求中的隐藏字段
    • 在这个答案中有一个很好的概述选项

目的是POST/PUT/DELETE/PATCH请求包括两件事:

  • 防伪饼干
  • 带有令牌的字段/标头

因此,防伪中间件可以验证没有XSRF.


有关cookie名称/域的更新

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

您可能只想在特殊情况下共享cookie,例如,如果您有2个应用程序,其中应用程序A中的表单发布到应用程序B.在这些情况下,请确保使用与两个应用程序匹配的域/子域,并且两者都使用相同的cookiea名称.