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

时间:2016-11-09 15:57:52

标签: asp.net asp.net-mvc cookies asp.net-core asp.net-core-mvc

我正在考虑更改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?

1 个答案:

答案 0 :(得分:10)

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

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

.Net Core 2.0.0 or greater there will be changes

参考: https://docs.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的代码)。您可能还想更改标题/表单名称,例如使用Angular的官方Antiforgery repo has an example并将标题更改为标准角度XSRF标记标题。

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

只要您使用asp表单标记助手,就必须对标准html表单执行任何其他操作,请参阅this question

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

  1. 获取IAntiforgery
  2. 致电var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
  3. 将其提供给您的js代码,以便它知道要将tokenSet.RequestToken值包含在名称为tokenSet.FormFieldName的字段或名称为tokenSet.HeaderName的标头中ajax请求。

    • 有一些选项,比如将令牌渲染到js布局中脚本部分内的JS对象中,在角度示例中添加JS可读cookie,继续渲染包含在ajax请求中的隐藏字段
    • in this answer
    • 选项有一个很好的概述
  4. 目标是POST / PUT / DELETE / PATCH请求包括两件事:

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

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

    有关Cookie名称/域名的更新

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

    • 详细了解Cookie的工作原理here

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

    • 了解有关XSRF here
    • 的更多信息