我创建了两个项目,可以说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/

10-09 22:42