[asp.net-mvc]可以使用 AntiForgeryToken AcceptVerbs 标记没有?

标签: Asp.net-MVC .Net C#
发布时间: 2017/3/25 17:21:54
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

反伪造令牌 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)] 。所以你问题的答案是,你可以使用 AntiForgeryToken 没有 AcceptVerbs 属性。你只需要在窗体中使用 POST 方法。

继续与样品,如果您指定 [AcceptVerbs(HttpVerbs.Get)] 的行动和 Html.BeginForm("DoSomething", "Default", FormMethod.Get) ,该示例不会工作,因为 GET 请求不包含该 cookie 只隐藏的输入的值获取查询字符串中进行编码。

赞助商