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