2009-11-02 5 views
7

Я использую ELMAH для обработки ошибок на моих сайтах MVC, и я заметил за последние пару недель, что у меня появилось несколько криптографических исключений. Отображается следующее сообщение:Ошибка маркера antiforgery ASP.MVC и криптографические ошибки

System.Security.Cryptography.CryptographicException: Заполнение недопустимы и не может быть удалено.

System.Web.Mvc.HttpAntiForgeryException: Необходимый токен анти-подделки не был прилагается или недействительно. ---> System.Web.HttpException: проверка MAC-адреса viewstate не удалась. Если это приложение размещено кластером Web Farm или , убедитесь, что конфигурация указывает то же самое значение validationKey и валидацию . AutoGenerate не может использоваться в кластере. --->

Приложение не работает в кластере, и я не могу воспроизвести эти ошибки. Они выглядят как действительные запросы, а не почтовые сообщения, и содержат файл cookie __RequestVerificationToken. У меня есть требуемый HTML-помощник на странице, внутри формы (моя форма входа).

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

Любой, кто видит это поведение или имеет какие-либо идеи о том, как диагностировать исключение - как я уже сказал, я не могу заставить его потерпеть неудачу. При удалении файла cookie в FF возникает другая ошибка. Изменение файла cookie (изменение или удаление содержимого) также приводит к другой ошибке, равно как и изменение содержимого скрытого ввода токена на странице.

ответ

4

Я не уверен, есть ли корреляция, но после добавления файла robots.txt, который исключает мои действия для входа, я больше не вижу этих ошибок. Я подозреваю, что это связано с тем, что искатель нажимает на страницу и пытается вызвать действие входа.

EDIT: Я также вижу эту проблему при получении старых файлов cookie после повторного использования пула приложений. Я прибегал к установке machineKey явно, так что изменения ключей проверки/дешифрования при перезагрузке приложений не влияют на старые файлы cookie, которые могут быть повторно отправлены.

После обновления сайта и перехода к фиксированной машинеKey я обнаружил, что все еще получаю эти ошибки от людей, у которых есть файлы cookie из предыдущей версии. В качестве временной работы я добавил следующий обработчик Application_Error:

public void Application_Error() 
    { 
     var exception = Server.GetLastError().GetBaseException(); 
     if (exception is System.Security.Cryptography.CryptographicException) 
     { 
      Server.ClearError(); 
      if (Request.IsAuthenticated) 
      { 
       var form = new FormsAuthenticationWrapper(); 
       form.SignOut(); 
       Session.Clear(); 
      } 
      Response.Cookies.Clear(); 
      Response.Redirect("~"); 
     } 
    } 
+0

machineKey был правильным решением. – 2010-09-10 13:48:55

+0

Подобный опыт - мой блог начал прерываться с перерывами после того, как я перенес его в ASP.NET MVC 2.Добавлено machineKey, и проблема исчезла. – 2010-09-10 13:49:23

1

Я не уверен, что это имеет какое-то особое отношение к системе антикоррозионной защиты, внутренние состояния исключения «Проверка MAC-адреса представлений не удалась». Из того, что я могу сказать, инфраструктура по умолчанию для антикоррозионной системы имеет зависимость на viewstate (на самом деле, если вы видите take a look here, вы увидите зависимость и ужас (метод CreateFormatterGenerator внизу)).

Что касается того, почему маска представления не работает по фальшивому запросу, я не уверен, но учитывая ужас, который существует при десериализации маркера antiforgery (обработка всего фальшивого запроса), он меня совсем не удивляет ..

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