我的表格看起来像
@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.
答案 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();
}