Казалось бы, оба подхода будут проверять наличие 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