要防止跨站点请求伪造,您需要为每个表单添加防伪令牌。
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
}
我希望避免将@Html.AntiForgeryToken
添加到所有表单中。有没有办法自动化这个过程?
德语Wikipedia article(Image)声明了一个隐藏字段,该标记将在@Html.BeginForm
后自动添加,但看起来这样不正确。
答案 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();
}
}
}