ViewStateUserKey + общий хостинг + ошибка проверки ViewStateMac

Итак, вопрос прост, хотя у меня начинаются сомнения, получит ли он ответ...

У меня есть веб-сайт, на котором я хотел защитить свое представление с помощью рекомендованного ViewStateUserKey.

На моей базовой странице (унаследованной от Page очевидно) у меня есть этот код:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        if (User.Identity.IsAuthenticated)
            base.ViewStateUserKey = Session.SessionID;
    }

Работает хорошо на localhost, однако, когда я загружаю его на хостинг (общий хостинг, предоставляемый одним из наших локальных провайдеров), он выдает традиционную ошибку "Проверка MAC-адреса состояния не пройдена" после аутентификации. Если я закомментирую этот код, он работает отлично, поэтому я уверен на 1000% в этом причина.

Каков наилучший подход для обеспечения безопасности viewstate на виртуальном хостинге? Я уже установил ViewStateMac="Включено", а также. Достаточно ли этого или каков рекомендуемый обходной путь?

1 ответ

Решение

С момента воспроизведения на локальном хосте, а не на сервере, мне кажется, что у вас есть некоторые проблемы с сеансом, и sessionID быстро меняется / истекает на вашем сервере, быстрее, чем истекает срок аутентификации.

И по этой причине с момента, когда пользователь видит страницу, до публикации, сеанс истек или изменился до изменения Аутентификации, поэтому sessionID отличается, и вы получаете эту ошибку.

Другие думают, что вы можете посмотреть, что вы установили machineKey на web.config.

Обновить

Сравните ваш код со Скоттом, который вы сделали по-другому. Скотт использует имя пользователя, которое совсем не меняется, и вы используете sessionid, который может измениться, как я говорю.

Для меня эфир использует то, что предлагает Скотт, имя пользователя, эфир какое-то другое значение, которое также не изменяется, например, cookie пользователя, которое не так легко изменить.

Так от Скотта http://www.hanselman.com/blog/ViewStateUserKeyMakesViewStateMoreTamperresistant.aspx

void Page_Init (Object sender, EventArgs e)
{ 
   if (User.Identity.IsAuthenticated)
      ViewStateUserKey = User.Identity.Name;
}

И это причина того, что Скотт проверяет, является ли пользователь Аутентифицированным, потому что он получает его имя. Если вы пользуетесь sessionid или cookie-файлом пользователя, вам не нужно проверять, аутентифицирован ли он.

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

/questions/29091274/cryptographicexception-zapolnenie-yavlyaetsya-nedopustimyim-i-ne-mozhet-byit-udaleno-a-proverka-sostoyaniya-predstavleniya-mac-ne-vyipolnena/29091290#29091290

Другие вопросы по тегам