«Проверка MAC-адреса состояния представления не удалась» только при повторной публикации из мобильного браузера, который некоторое время простаивал - PullRequest
0 голосов
/ 03 июля 2018

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

Я получаю только сообщение об ошибке «Проверка валидации ViewState MAC» при повторной публикации из мобильного браузера, который оставался открытым в течение некоторого времени. Ошибка никогда не появляется при отправке формы из браузера компьютера. Он также не появляется при отправке из мобильного браузера большую часть времени. Он появляется только тогда, когда я открываю вкладку для мобильных устройств, которая уже была отправлена, и снова нажимаю кнопку отправки.

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

<Ч />

Я попробовал приведенные ниже решения, и ни одно из них не сработало:

  1. Вручную установите MachineKey на мой web.config
  2. Используйте утилиту aspnet_regiis для запуска управляемого приложения, в котором будут сохранены машинные ключи.
  3. Решения, предложенные в этой статье
  4. набор LoadUserProfile = True в пуле приложений
  5. Установите SessionTimeout = 0 в пуле приложений IIS.
  6. Защищено мои куки через 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» и запросить пользовательское сообщение с объяснением ошибки проверки формы. Таким образом, безопасность и удобство использования сбалансированы.

Я был вдохновлен этой статьей для этого вероятного краткосрочного решения.

...