У меня проблемы с AntiForgeryToken в ASP.Net MVC. Если я выполняю iisreset на своем веб-сервере, и пользователь продолжает сеанс, он переходит на страницу входа. Не страшно, но токен AntiForgery взорвется, и единственный способ возобновить работу - удалить куки в браузере.
В бета-версии версии 1 при чтении cookie-файлов у меня возникали ошибки, поэтому я обычно чистил его перед запросом токена проверки, но это было исправлено, когда он был выпущен.
Пока я думаю, что вернусь к своему коду, который исправил проблему с бета-версией, но я не могу помочь, но думаю, что что-то упустил. Есть ли более простое решение, черт возьми, я должен просто оставить свой помощник и создать новый с нуля? У меня возникает ощущение, что большая часть проблемы заключается в том, что он так глубоко привязан к старому конвейеру ASP.Net и пытается заставить его сделать то, чего он на самом деле не разрабатывал.
Я посмотрел исходный код ASP.Net MVC 2 RC, и похоже, что код сильно не изменился, поэтому, хотя я и не пробовал, я не думаю, что там есть какие-либо ответы .
Вот соответствующая часть трассировки стека исключения.
Редактировать: Я только что понял, что не упомянул, что это просто попытка вставить токен в запрос GET. Это не проверка, которая происходит, когда вы запускаете POST.
System.Web.Mvc.HttpAntiForgeryException: A required anti-forgery token was not
supplied or was invalid.
---> System.Web.HttpException: Validation of viewstate MAC failed. If this
application is hosted by a Web Farm or cluster, ensure that <machineKey>
configuration specifies the same validationKey and validation algorithm.
AutoGenerate cannot be used in a cluster.
---> System.Web.UI.ViewStateException: Invalid viewstate.
Client IP: 127.0.0.1
Port: 4991
User-Agent: scrubbed
ViewState: scrubbed
Referer: blah
Path: /oursite/Account/Login
---> System.Security.Cryptography.CryptographicException: Padding is invalid and
cannot be removed.
at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
at System.Security.Cryptography.CryptoStream.FlushFinalBlock()
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo)
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
--- End of inner exception stack trace ---
--- End of inner exception stack trace ---
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
at System.Web.UI.ViewStateException.ThrowMacValidationError(Exception inner, String persistedState)
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
at System.Web.Mvc.AntiForgeryDataSerializer.Deserialize(String serializedToken)
--- End of inner exception stack trace ---
at System.Web.Mvc.AntiForgeryDataSerializer.Deserialize(String serializedToken)
at System.Web.Mvc.HtmlHelper.GetAntiForgeryTokenAndSetCookie(String salt, String domain, String path)
at System.Web.Mvc.HtmlHelper.AntiForgeryToken(String salt, String domain, String path)