Asp.net mvc 4 AntiForgery.Validate()与ValidateAntiForgeryToken

Asp.net mvc 4 AntiForgery.Validate()与ValidateAntiForgeryToken,asp.net-mvc-4,antiforgerytoken,Asp.net Mvc 4,Antiforgerytoken,方法是否为System.Web.Helpers.AntiForgery.Validate(); 是否执行与[ValidateAntiForgeryToken]装饰完全相同的功能 我也在考虑更改我的注销方法: [HttpPost] public virtual ActionResult LogOff() { if (User.Identity.Name != "") { System.W

方法是否为System.Web.Helpers.AntiForgery.Validate(); 是否执行与[ValidateAntiForgeryToken]装饰完全相同的功能

我也在考虑更改我的注销方法:

    [HttpPost]        
    public virtual ActionResult LogOff()        
    {
        if (User.Identity.Name != "")
        {
            System.Web.Helpers.AntiForgery.Validate();
            WebSecurity.Logout();
        }           

        return RedirectToAction(MVC.Account.Login());
    }
这将防止在系统因登录过期而注销时引发防伪异常。我只想确定AntiForgery.Validate()将执行与ValidateAntiForgeryToken相同的任务


我使用了一个额外的异常处理程序来捕获这个异常。但是问题仍然存在,Elmah仍然记录了此异常,我收到了许多消息。

这两种方法似乎都可以验证表单中存在的AntiForgeryToken。我已经检查了程序集,ValidateAntiForgeryTokenAttribute确实调用AntiForgery.Validate方法进行验证。当验证失败时,这两种方法都将抛出HttpValidateAntiForgeryException。因此,他们是否执行相同任务的简短答案是肯定的

ValidateAntiForgeryTokenAttribute在OnAuthorization方法的MVC执行周期的早期验证令牌,这一点有细微的区别。如果在执行AntiForgeryToken.Validate()检查之前在控制器操作中执行资源密集型任务,这可能会影响性能

另一件需要注意的事情是,通过要求每个HttpPost操作具有以下代码段,您可能为自己创建了额外的工作(更不用说省略它时可能留下的安全漏洞了)

if (User.Identity.Name != "")
{
    System.Web.Helpers.AntiForgery.Validate();
    WebSecurity.Logout();
}
通过创建以下属性并用它装饰那些post方法,您将获得所需的功能,而不需要在每个post操作中都包含上述代码

using System;
using System.Web.Mvc;

[AttributeUsage( AttributeTargets.Method | AttributeTargets.Class , AllowMultiple = false , Inherited = true )]
public class ValidateOrSignOutAntiForgeryTokenAttribute : 
    FilterAttribute , 
    IAuthorizationFilter
{

    public void OnAuthorization( AuthorizationContext filterContext )
    {
        if( filterContext == null )
        {
            throw new ArgumentNullException( "filterContext" );
        }

        if( filterContext.HttpContext.User != null &&
            filterContext.HttpContext.User.Identity.Name != "" )
        {
            try
            {
                System.Web.Helpers.AntiForgery.Validate();
            }
            catch
            {
                WebSecurity.Logout();
                throw;
            }
        }
    }

}

最后一件事,例外情况是正常的验证防伪。这是因为AntiForgery.Validate方法在验证失败时抛出HttpValidateAntiForgeryException。正如您在上面的代码中看到的,我捕获了此异常,并在完成注销后重新抛出它。

轻微更正它抛出了一个
HttpAntiForgeryException
没有HttpValidateAntiForgeryException感谢详细的回答A.L。