Я добавляю лучший ответ, потому что это такая боль и плохо отвечает по всему Интернету. Я подумал, что добавлю свои текущие рабочие решения.
Принципиально (игнорируя различные опции) AntiForgeryToken работаетпутем добавления файла cookie сеанса, который затем читается при публикации формы, путем украшения контроллера с помощью атрибута [ValidateAntiForgeryToken].
Прежде чем приступить к исправлению чего-либо в качестве общего правила, всегда выполните следующее.
В web.config создайте ключ machineKey следующим образом.
<machineKey validationKey="YOUR_KEY"
decryptionKey="YOUR_KEY"
validation="SHA1"
decryption="AES" />
** Обратите внимание, что SHA1 на самом деле уже не очень безопасен, но это другое обсуждение**
Google <machineKey> Generator
и настройте.
http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.100%29.aspx
Измените имя файла cookie по умолчанию с __RequestVerificationToken на имя, которое не будет использоватьсядругое приложение.(Я всегда использую GUID).
Сделайте это с AntiForgeryConfig.CookieName = "YOUR_NAME";
Создайте новый пользовательский атрибут.
Причина, по которой эта ошибка, кажется, появляется без причины, заключается в том, что cookie действителен только в течение всей сессии.По разным причинам, но в основном из-за того, что люди оставляют открытыми страницы очень-очень-очень-очень долго, время сеанса заканчивается.Поскольку время сеанса истекло, cookie больше не действителен.
Другая проблема заключается в том, что если у вас есть атрибут [Authorize] в опубликованном контроллере, поток вещей вызовет исключение HttpAntiForgeryException, прежде чем он проверит, кто аутентифицирован.(в большинстве аутентификаций на основе файлов cookie, когда сеанс истек, пользователь больше не проходит аутентификацию)
Способ решить эту проблему - создать собственный атрибут [CustomValidateAntiForgeryToken].
[AttributeUsage( AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true )]
public class CustomValidateAntiForgeryToken : FilterAttribute, IAuthorizationFilter {
public void OnAuthorization( AuthorizationContext filterContext ) {
if ( filterContext == null ) {
throw new ArgumentNullException( "filterContext" );
}
try {
AntiForgery.Validate();
}
catch {
// Here do whatever is you wish
// you could just re throw the error or what ever.
// In this case I have redirected to a Signout
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new {
action = "Sign_Out",
controller = "SOME_CONTROLLER",
area = ""
}
)
);
}
}
}
И, наконец,если вы измените все это в любой действующей системе, убедитесь, что все вышли из системы, закрывают свои браузеры, если это возможно, даже перезагружают и очищают их куки и кеши.Вы можете по-прежнему получать сообщение об ошибке до тех пор, пока не сделаете это для каждого пользователя, даже после изменения кода.
Очевидно, что у людей совершенно разные потребности, но, надеюсь, это дает достаточно советов для управления этой очень распространенной и раздражающей проблемой.
Если кто-нибудь увидит что-нибудь, что поможет или может быть добавлено, пожалуйста, сделайте.