未找到 MVC 4 防伪

MVC 4 Anti-Forgery Not Found

我的表格看起来像

@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.

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

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

Generates a hidden form field (anti-forgery token) that is validated when the form is submitted.

为了传递 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 中的 return 应该是 return RedirectToAction("Something") 而不是视图。

[ValidateAntiForgeryToken]

POST 操作上验证,而不是在 GET 上验证。因此,您的代码应如下所示:

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

    <!-- Some form inputs -->

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

以及您的操作方法:

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