首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用不带AcceptVerbs标签的AntiForgeryToken吗?

我可以使用不带AcceptVerbs标签的AntiForgeryToken吗?
EN

Stack Overflow用户
提问于 2010-12-18 00:46:54
回答 1查看 647关注 0票数 0

我想使用AntiForgeryToken函数,但AcceptVerbs post不适用。我得到了防伪错误。有没有办法在没有post方法的情况下做到这一点?

代码语言:javascript
复制
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  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-18 01:04:14

防伪令牌通过cookie和表单中的隐藏输入字段工作。它们都拥有相同的加密值。当控制器处理用[ValidateAntiForgeryToken]修饰的操作时,它会检查cookie中的值和隐藏的输入字段是否匹配。如果他们没有-你会得到一个很好的例外。

您可以使用如下代码

查看:

代码语言:javascript
复制
<% using (var form = Html.BeginForm("DoSomething", "Default")) {  %>
<%:Html.ValidationMessageFor(x => x) %>
<%:Html.AntiForgeryToken() %>
<%:Html.Hidden("a", 200) %>
<input type="submit" value="Go"/>
<%}%>

控制器:

代码语言:javascript
复制
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方法。

要继续示例,如果在操作和Html.BeginForm("DoSomething", "Default", FormMethod.Get)上指定[AcceptVerbs(HttpVerbs.Get)],则示例将不起作用,因为GET请求不包含cookie,只有隐藏的输入值被编码到查询字符串中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4472783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档