我创建了两个项目,可以说projectA和projectB。
现在在projectA中,我创建了以下操作方法。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index(Employee employee)
{
return View();
}
并且,此操作方法具有一个Index.cshtml视图,该视图具有以下形式:
@ Html.AntiForgeryToken()在表单标签中。
现在,在projectB中,我创建了一个动作方法和一个视图。
该视图具有动作形式
projectA /首页/索引
和,
@ Html.AntiForgeryToken()帮助器。
现在的问题是,当我从projectB提交表单时,它命中了projectA的操作方法。
为什么会这样呢?我在这里想念什么?
最佳答案
最近.Net中的令牌生成和验证相对复杂。它基于将Cookie与发布的值进行比较,但不是那么简单,这两者并不相同。System.Web.Helpers.AntiXsrf.TokenValidator
比较SecurityToken
中的AntiForgeryToken
。但是,它都是加密的,并且还包含其他字段,例如用户名。如果您在同一台计算机上运行,具有相同的加密密钥,并且在同一域上,则仍然可以使用。但是,cookie名称也对应用程序路径进行了编码。因此,当您从一个应用程序发布到另一个应用程序时,cookie名称将不匹配,并且验证将不起作用。
一种解决方法是将AntiForgeryConfig.CookieName
设置为相同的值。尽管它可以与同一台机器(具有相同密钥)和同一域上的应用程序一起使用,但我认为这不是一个好习惯,因为它在任何其他情况下都无法使用。您可以在不同的计算机上将密钥设置为相同(这已经不是安全的好习惯了),但是cookie不会发送到不同的域。
关于c# - ValidateAntiForgeryToken筛选器不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51298538/