Я знаю, что этот вопрос часто задавался в StackOverflow, но мой случай немного отличается. Я проверил все ответы, связанные с этой проблемой, и ни один из них не решил мою проблему, поскольку в моем случае это происходит только с браузерами на мобильных устройствах.
Я получаю только сообщение об ошибке «Проверка валидации ViewState MAC» при повторной публикации из мобильного браузера, который оставался открытым в течение некоторого времени. Ошибка никогда не появляется при отправке формы из браузера компьютера. Он также не появляется при отправке из мобильного браузера большую часть времени. Он появляется только тогда, когда я открываю вкладку для мобильных устройств, которая уже была отправлена, и снова нажимаю кнопку отправки.
Однако, это также происходит постоянно, когда я закрываю свой браузер (чтобы он не работал в фоновом режиме для мобильных устройств), снова открываю его и повторно отправляю форму. Я полагаю, что это главная проблема этой ошибки (перезапуск браузера вызывает перезагрузку страницы на мобильном телефоне, прежде чем что-то нажимать).
<Ч />
Я попробовал приведенные ниже решения, и ни одно из них не сработало:
- Вручную установите MachineKey на мой
web.config
- Используйте утилиту aspnet_regiis для запуска управляемого приложения, в котором будут сохранены машинные ключи.
- Решения, предложенные в этой статье
- набор
LoadUserProfile = True
в пуле приложений
- Установите
SessionTimeout = 0
в пуле приложений IIS.
- Защищено мои куки через http.
Примечание: я знаю, что настройка enableViewStateMac="false"
в моем web.config
решит мою проблему, но я действительно не хочу этого делать, чтобы избежать снижения безопасности в моем приложении.
<Ч />
После нескольких тестов я заметил, что ошибка генерируется только тогда, когда мобильный браузер принудительно перезагружает / перезапускает страницу. Например, если я повторно отправляю форму, которая уже была отправлена с мобильного телефона, в большинстве случаев она не выдает ошибку. Однако иногда, когда я открываю браузер на мобильном телефоне, он принудительно перезагружает / перезапускает страницу, прежде чем я нажимаю на что-либо. Теперь, когда я нажимаю кнопку отправки, появляется ошибка.
Возможно, эта принудительная перезагрузка / повторный запуск вызывает эту ошибку, поскольку ViewState
изменяется.
Другая возможность состоит в том, что мобильный телефон истекает сеансы, хотя я установил, что сеансы не истекают в моем IIS.
Еще одна возможность может заключаться в том, что мобильный телефон не позволяет браузеру работать в фоновом режиме, что приводит к принудительной перезагрузке для повторного создания страницы, когда пользователь снова открывает браузер.
<Ч />
Я использую приведенный ниже код в своем заявлении:
Partial Class MasterPage
Inherits System.Web.UI.MasterPage
Private Const AntiXsrfTokenKey As String = "__AntiXsrfToken"
Private Const AntiXsrfUserNameKey As String = "__AntiXsrfUserName"
Private _antiXsrfTokenValue As String
Protected Sub Page_Init(sender As Object, e As EventArgs)
' The code below helps to protect against XSRF attacks
Dim requestCookie = Request.Cookies(AntiXsrfTokenKey)
Dim requestCookieGuidValue As Guid
If requestCookie IsNot Nothing AndAlso Guid.TryParse(requestCookie.Value, requestCookieGuidValue) Then
' Use the Anti-XSRF token from the cookie
_antiXsrfTokenValue = requestCookie.Value
Page.ViewStateUserKey = _antiXsrfTokenValue
Else
' Generate a new Anti-XSRF token and save to the cookie
_antiXsrfTokenValue = Guid.NewGuid().ToString("N")
Page.ViewStateUserKey = _antiXsrfTokenValue
Dim responseCookie = New HttpCookie(AntiXsrfTokenKey) With {
.HttpOnly = True,
.Value = _antiXsrfTokenValue
}
If FormsAuthentication.RequireSSL AndAlso Request.IsSecureConnection Then
responseCookie.Secure = True
End If
Response.Cookies.[Set](responseCookie)
End If
AddHandler Page.PreLoad, AddressOf master_Page_PreLoad
End Sub
Protected Sub master_Page_PreLoad(sender As Object, e As EventArgs)
If Not IsPostBack Then
' Set Anti-XSRF token
ViewState(AntiXsrfTokenKey) = Page.ViewStateUserKey
ViewState(AntiXsrfUserNameKey) = If(Context.User.Identity.Name, [String].Empty)
Else
' Validate the Anti-XSRF token
If DirectCast(ViewState(AntiXsrfTokenKey), String) <> _antiXsrfTokenValue OrElse DirectCast(ViewState(AntiXsrfUserNameKey), String) <> (If(Context.User.Identity.Name, [String].Empty)) Then
Throw New InvalidOperationException("Validation of Anti-XSRF token failed.")
End If
End If
End Sub
Private Sub MasterPage_Load(sender As Object, e As EventArgs) Handles Me.Load
'Add Base Path and Canonical URL
Dim strBasePath = "<base href='" & AppSettings("LivePath") & "' />"
Page.Header.Controls.Add(New LiteralControl(strBasePath))
End Sub
End Class
<Ч />
Я надеюсь, что есть решение для этого, так как я не хочу в конечном итоге установить enableViewStateMac="false"
в моем web.config
<Ч />
[Update]
Потенциальное решение:
Мое текущее потенциальное решение для этого - обработать ошибку «Ошибка проверки MAC-адреса ViewState» и запросить пользовательское сообщение с объяснением ошибки проверки формы. Таким образом, безопасность и удобство использования сбалансированы.
Я был вдохновлен этой статьей для этого вероятного краткосрочного решения.