【问题标题】:AntiForgery.Validate() vs ValidateAntiForgeryTokenAntiForgery.Validate() 与 ValidateAntiForgeryToken
【发布时间】:2014-04-24 03:56:26
【问题描述】:

方法 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 仍然记录了这个异常,而且我收到了很多消息。

【问题讨论】:

    标签: asp.net-mvc-4 antiforgerytoken


    【解决方案1】:

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

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

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

    if (User.Identity.Name != "")
    {
        System.Web.Helpers.AntiForgery.Validate();
        WebSecurity.Logout();
    }
    

    通过创建以下属性并用它装饰这些发布方法,您将拥有所需的功能,并且不需要在每个发布操作中都有上述代码

    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. 的详细回答
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2018-07-05
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多