我正在考虑更改ASP.NET Core中默认防伪cookie的名称。
我想更改cookie名称的原因是为了匿名化cookie,我认为最终用户没有理由认定这个cookie的责任。
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName
答案 0 :(得分:10)
您可以在Startup.ConfigureServices
中设置不同的名称,如下所示:
services.AddAntiforgery(opts => opts.CookieName = "MyAntiforgeryCookie");
.Net Core 2.0.0 or greater there will be changes:
用于以下用途:
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请求,则需要在请求中包含包含生成的令牌的标头或字段。你基本上需要:
IAntiforgery
var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
将其提供给您的js代码,以便它知道要将tokenSet.RequestToken
值包含在名称为tokenSet.FormFieldName
的字段或名称为tokenSet.HeaderName
的标头中ajax请求。
目标是POST / PUT / DELETE / PATCH请求包括两件事:
因此,防伪中间件可以验证没有XSRF。
有关Cookie名称/域名的更新
合理的默认值是每个应用程序都有自己的cookie。您通常使用默认方法获得该值,因为cookie上没有专门设置域,因此cookie从请求中获取域。这将意味着不同的应用程序使用不同的cookie,除非应用程序托管在同一个域中。
您可能只想在特殊情况下共享cookie,例如,如果您有2个应用程序,其中应用程序A中的表单发布到应用程序B.在这些情况下,请确保使用与两个应用程序匹配的域/子域使用相同的cookiea名称。