Я добавляю лучший ответ здесь, потому что это такая боль и плохо ответило на всем протяжении сети, я думал, что я хотел бы добавить мои в настоящее время рабочих решений.
В целом (игнорируя различные варианты) AntiForgeryToken работает, добавляя файл cookie сеанса, который затем читается, когда форма отправляется, украшая контроллер атрибутом [ValidateAntiForgeryToken].
Прежде всего, прежде чем мы начнем фиксировать что-либо в качестве общего правила, всегда делайте следующее.
В web.config создайте машинуKey следующим образом.
<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
Изменить имя по умолчанию печенье от «__RequestVerificationToken» на тот, который будет не используется другим приложением. (Я всегда использую GUID).
ли это с AntiForgeryConfig.CookieName = "YOUR_NAME";
Создать новый пользовательский атрибут.
Причина, по которой эта ошибка, по-видимому, не возникает, заключается в том, что файл cookie действителен только для жизни сеанса. По разным причинам, но главным образом тот факт, что люди оставляют страницы открытыми очень очень долгое время, время сеанса. Поскольку сеанс завершился, cookie уже недействителен.
Еще одна проблема заключается в том, что если у вас есть атрибут [Авторизовать] на отправленном контроллере, поток вещей упустит исключение 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 = ""
}
)
);
}
}
}
И, наконец, если вы измените это в любом в настоящее время живой системы убедитесь, что все выходит из системы, закрывает свои браузеры даже перезагружается, если это возможно, и очищает их куки и кэш-память. Вы все равно можете получить ошибку, пока не сделаете это для каждого пользователя даже после изменения кода.
Очевидно, что люди имеют совершенно разные потребности, но, надеюсь, это дает достаточный совет для контроля этой очень распространенной и раздражающей проблемы.
Если кто-либо видит что-либо, что поможет или может быть добавлено, пожалуйста, сделайте это.
Анти-подделка фактически происходит в 'System.Web.WebPages', а не MVC. Поэтому вы хотели бы посмотреть в этом источнике, а не на MVC. –
Я не уверен, что AntiForgeryToken имеет какое-либо отношение к пользователю, так как он может использоваться независимо от авторизации. Это может быть связано во времени. – stevethethread