我可以使用没有AcceptVerbs标记的AntiForgeryToken吗?

时间:2010-12-17 16:46:54

标签: c# .net asp.net-mvc antiforgerytoken

我想使用AntiForgeryToken函数,但AcceptVerbs帖子不适用。我得到了防伪错误。有没有办法在没有post方法的情况下做到这一点?

public ActionResult Page1(string data)
{   //code with view that includes link to Edit   }

public ActionResult Page2(string data)
{   //code with view that includes link to Edit   }

public ActionResult Edit(string pageName)
{   //execution then redirect to Page1/Page2  }

1 个答案:

答案 0 :(得分:2)

防伪标记由cookie和表单中的隐藏输入字段组成。它们都具有相同的加密值。当控制器处理用[ValidateAntiForgeryToken]修饰的动作时,它会检查cookie和隐藏输入字段中的值是否匹配。如果他们不这样做 - 你得到一个很好的例外。

您可以使用此类代码

查看:

<% using (var form = Html.BeginForm("DoSomething", "Default")) {  %>
<%:Html.ValidationMessageFor(x => x) %>
<%:Html.AntiForgeryToken() %>
<%:Html.Hidden("a", 200) %>
<input type="submit" value="Go"/>
<%}%>

控制器:

public class DefaultController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
    [ValidateAntiForgeryToken]
    public ActionResult DoSomething(int a)
    {
        return View("Index");
    }
}

但是生成的表单会获得method="post"属性。在控制器端,您无需指定[AcceptVerbs(HttpVerbs.Post)]。因此,您的问题的答案是您可以在没有AcceptVerbs属性的情况下使用AntiForgeryToken。您只需要在表单中使用POST方法。

要继续使用示例,如果在操作和[AcceptVerbs(HttpVerbs.Get)]上指定Html.BeginForm("DoSomething", "Default", FormMethod.Get),则示例将不起作用,因为GET请求不包含cookie,只有隐藏的输入值被编码在查询字符串中。