2012-01-16 5 views
2

У меня есть ActionResult, украшенный ValidateAntiForgeryToken и Authorize. Как только мой лимит авторизации истекает, я получаю «» Необходимый токен анти-подделки не был указан или был недействителен »вместо того, чтобы перенаправляться на мою страницу входа.ValidateAntiForgeryToken и авторизационный тайм-аут

Может кто-нибудь объяснить, почему это происходит?

ответ

2

ValidateAntiForgeryTokenAttribute

'Представляет атрибут, который используется для обнаружения ли сервер запрос был подделан.

MSDN. То, что Html.AntiForgeryToken() делает, выводит скрытое поле в форму, что-то вроде: <input name="__RequestVerificationToken" type="hidden" value="XXX" />.

Что делает ValidateAntiForgeryTokenAttribute в ответ на пост, сравнивает опубликованное значение с ранее сохраненным cookie, чтобы убедиться, что они совпадают. См. http://aspnet.codeplex.com/SourceControl/changeset/view/72551#338576 (метод OnAuthorization) для деталей. Файл cookie имеет имя RequestVerificationToken_Lw (вы можете использовать инструмент для проверки файлов cookie, например FireCookie).

Хранилище файлов cookie - это куки-файл сеанса (важный бит). Это означает, что когда ваш тайм-аут авторизации достигнут (по умолчанию 30 минут по умолчанию в .NET), cookie истекает, он не отправляется со следующим запросом и не сравнивается с скрытым значением поля, бросая HttpAntiForgeryException.

+0

Спасибо за ответ ... Я не совсем уверен, как это исправить. В принципе, я хочу, чтобы атрибут выполнялся перед и перенаправлял пользователя на мою страницу входа. Любая идея, как это сделать? – stub

+2

Атрибуты фильтра действий выполняются в том порядке, в котором они были добавлены, поэтому, если вы добавите Авторизовать перед ValidateAntiForgeryToken, тогда он будет работать. В качестве альтернативы вы можете изменить свойство Order для изменения заказа. –

0

Обязательно используйте @ Html.AntiForgeryToken() с в BeginForm() {....} в представлении

@using(Html.BeginForm()){ 
     @Html.AntiForgeryToken() 
    . 
    . 
    . 
    . 
    } 

Тогда это будет проверяться в атрибуте действия фильтра [ValidateAntiForgeryToken]

+0

Я уже делаю это. Моя логика защиты от подделки работает как ожидалось, за исключением того, что превышен лимит времени ожидания . Затем я получаю сообщение «Требуемый токен анти-подделки не был указан или был недействителен». – stub

Смежные вопросы