如何扩展或覆盖BeginForm以包含AntiForgeryToken字段

zgi*_*rod 13 security dry csrf asp.net-mvc-3

我正在阅读这篇文章(http://weblogs.asp.net/dixin/archive/2010/05/22/anti-forgery-request-recipes-for-asp-net-mvc-and-ajax.aspx)防止CSRF攻击.似乎解决方案是在每个表单内创建一个标签.

<%: this.Html.AntiForgeryToken(Constants.AntiForgeryTokenSalt)%>
Run Code Online (Sandbox Code Playgroud)

但是,我真的不想在每个表单中复制并粘贴该代码.我想扩展或覆盖BeginForm以创建一个自动添加AntiForgeryToken的BeginSecureForm.我不知道如何在BeginForm和EndForm之间添加内容.

有任何想法吗?

小智 17

您应该使用此代码,将令牌放在表单后面的正确位置:

public static MvcForm BeginAntiForgeryForm(this HtmlHelper htmlHelper)
    {
        var mvcForm = htmlHelper.BeginForm();
        htmlHelper.ViewContext.Writer.Write(htmlHelper.AntiForgeryToken().ToHtmlString());
        return mvcForm;
    }
Run Code Online (Sandbox Code Playgroud)