使用Razor在ASP.NET MVC中自动添加防伪标记

时间:2017-10-19 12:02:49

标签: asp.net-mvc security razor antiforgerytoken

要防止跨站点请求伪造,您需要为每个表单添加防伪令牌。

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
}

我希望避免将@Html.AntiForgeryToken添加到所有表单中。有没有办法自动化这个过程?

德语Wikipedia articleImage)声明了一个隐藏字段,该标记将在@Html.BeginForm后自动添加,但看起来这样不正确。

1 个答案:

答案 0 :(得分:0)

找到(非最佳)解决方案here

他使用另一种扩展方法来添加防伪标记。这样做的缺点是,您需要为所有现有HtmlHelper扩展创建新方法,并且代码可能会变得不一致。

public static class FormExtensions
{
    public static MvcForm BeginDataForm(this HtmlHelper html, string action, string controller)
    {
        var form = html.BeginForm(action, controller);

        html.ViewContext.Writer.Write(html.AntiForgeryToken().ToHtmlString());

        return form;
    }
}

在服务器端,他找到了一个优雅的解决方案来验证令牌。他添加了一个新的AuthorizationFilter并在每个Post方法上验证令牌。

public class GlobalAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    public sub OnAuthorization(filterContext As AuthorizationContext)
    {
        if (filterContext.HttpContext.Request.HttpMethod.ToUpper() == "POST")
        {
            AntiForgery.Validate();
        }
    }
}