0

我想使用 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  }
4

1 回答 1

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,只有隐藏的输入值被编码在查询字符串中。

于 2010-12-17T17:04:14.237 回答