ValidateAntiForgeryToken筛选器不起作用

时间:2018-07-12 06:20:37

标签: c# asp.net-mvc security model-view-controller action-filter

我创建了两个项目,比如projectA和projectB。

现在在projectA中,我创建了以下操作方法。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Index(Employee employee)
    {
        return View();
    }

而且,此操作方法具有一个视图Index.cshtml,该视图具有一个窗体和

  

@ Html.AntiForgeryToken()在表单标签中。

现在在projectB中,我已经创建了一个动作方法和一个视图。

此视图的表单具有动作

  

projectA / Home / Index

然后

  

@ Html.AntiForgeryToken()帮助器。

现在的问题是,当我从projectB提交表单时,它击中了projectA的操作方法。

为什么会这样?我在这里想念什么?

1 个答案:

答案 0 :(得分:-1)

最近.Net中的令牌生成和验证相对复杂。它基于将Cookie与发布的值进行比较,但不是那么简单,这两者并不相同。

System.Web.Helpers.AntiXsrf.TokenValidatorSecurityToken中比较AntiForgeryToken。但是,它都是加密的,并且还包含其他字段,例如用户名。如果您在同一台计算机上运行,​​具有相同的加密密钥,并且在同一域上,它仍然可以工作。但是,cookie名称也对应用程序路径进行了编码。因此,当您从一个应用程序发布到另一个应用程序时,cookie名称将不匹配,并且验证将不起作用。

一个解决方案是将AntiForgeryConfig.CookieName设置为相同的值。尽管它可以与同一台机器(具有相同密钥)和同一域上的应用程序一起使用,但我认为这不是一个好习惯,因为它在任何其他情况下都无法使用。您可以在不同的计算机上将密钥设置为相同(这在安全性方面已经不是很好的习惯了),但是cookie不会发送到不同的域。