AntiForgery.Validate() против ValidateAntiForgeryToken

Использует ли метод 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());
    }

Это предотвратит создание исключения Anti Forgery, когда система уже вышла из системы из-за истечения срока действия входа. Я просто хочу быть уверенным, что AntiForgery.Validate() будет выполнять ту же задачу, что и ValidateAntiForgeryToken.

Я использовал дополнительный обработчик исключений, чтобы поймать это исключение. Однако проблема осталась в том, что Elmah по-прежнему регистрирует это исключение, и я получаю много сообщений.


person Chris Nevill    schedule 18.03.2014    source источник


Ответы (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;
            }
        }
    }

}

И последнее, исключения в Validation of AntiForgery нормальны. Это связано с тем, что метод AntiForgery.Validate создает исключение HttpValidateAntiForgeryException при сбое проверки. Как вы видите в приведенном выше коде, я поймал это исключение и повторно сгенерировал его после завершения выхода из системы.

person Anthony Longano    schedule 18.03.2014
comment
Незначительное исправление выдает HttpAntiForgeryException исключения HttpValidateAntiForgeryException нет Спасибо за подробный ответ А.Л. - person reachingnexus; 18.10.2017