找不到MVC 4防伪

时间:2015-01-06 15:34:15

标签: asp.net-mvc asp.net-mvc-4 c#-4.0 razor

我的表格看起来像

@using(Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <!-- Some form inputs -->

    <div>@Html.ActionLink("LinkText", "MyAction")</div>
}

我的行动定义如下:

[ValidateAntiForgeryToken}
public ActionResult MyAction()
{
    return View();
}

当我点击操作链接时,我收到错误:The required anti-forgery form field "__RequestVerificationToken" is not present.

2 个答案:

答案 0 :(得分:1)

操作链接向服务器执行GET请求。在GET请求期间,不会传递任何表单字段,包括AntiForgeryToken的隐藏字段。这就是你得到错误的原因。 AntiForgeryTokens仅在将信息发布回服务器而不是基本GET请求时才起作用。

Here is the MSDN用于AntiForgeryToken助手。请注意:状态:

  

生成经过验证的隐藏表单字段(防伪标记)   表格提交时。

要传递AntiForgeryToken,您需要POST /提交表单。更改以下内容,所有内容都应按预期工作。

@using(Html.BeginForm("MyAction", "MyController"))
{
    @Html.AntiForgeryToken()

    <!-- Some form inputs -->

    <div><input type="submit" value="MyText"/></div>
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction()
{
    return View();
}

但是,我想指出上面的代码更改破坏了MVC的Post-Redirect-Get模式。您从HttpPost ActionResult返回的内容应该是RedirectToAction("Something"),而不是视图。

答案 1 :(得分:0)

  

[ValidateAntiForgeryToken]

POST操作上验证,而不是在GET上验证。所以,你的代码应该是这样的:

@using(Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <!-- Some form inputs -->

    <input type="submit" value="Submit" />
}

和你的行动方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MyAction()
{
    return View();
}