我正在考虑更改ASP中默认防伪造cookie的名称。网络核心。
我想更改cookie名称的原因是为了匿名化cookie,在我看来,最终用户没有理由能够确定此cookie的责任。
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions.CookieName
- 如何更改防伪cookie的名称?我想它应该在Startup.cs文件中以某种方式完成?
- 更改默认防伪造cookie的名称可能会产生什么影响? 如何在ASP中使用防伪cookie ?网络核心?
- 不同的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请求,则需要在请求中包含包含生成的令牌的头或字段。你基本上需要:
- 获取
IAntiforgery
呼叫 让它可用到你的js代码,所以它知道关于值
tokenSet.RequestToken
被包括作为一个字段名称tokenSet.FormFieldName
或标题名称tokenSet.HeaderName
在每个ajax请求。- 有几个选项,比如在JS布局的脚本部分中将令牌渲染成JS对象,添加JS可读cookie(如angular示例),继续渲染ajax请求中包含的隐藏字段
- 这个答案中有一个很好的选项概述
var tokenSet = antiforgery.GetAndStoreTokens(httpContext);
目标是POST/PUT/DELETE/PATCH请求包含2件事:
- 防伪cookie
- 带有令牌 的字段/报头
因此防伪中间件可以验证不存在XSRF。
更新cookie名称/域名
合理的默认值是每个应用程序都有自己的cookie。您通常使用默认方法来获得,因为没有在cookie上特别设置域,因此cookie从请求中获取域。这将意味着不同的应用程序使用不同的cookie,除非应用程序托管在相同的域。
- 阅读更多关于cookie的工作原理
你可能只希望在特殊情况下共享cookie,例如,如果你有两个应用程序,其中应用a中的表单发送到应用b。在这种情况下,确保你使用的域名/子域名匹配两个应用程序,并使用相同的cookiea名称。
- 点击这里阅读更多关于XSRF的信息