Вопрос по asp.net, c# – ViewStateUserKey + общий хостинг + ошибка проверки ViewStateMac

2

Таким образом, вопрос прост, хотя я начинаю сомневаться в том, что мне ответят ...

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

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

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

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

Хорошо работает на локальном хосте, однако, когда я загружаю его на хостинг (общий хостинг, предоставляемый одним из наших локальных провайдеров), он дает традиционную & quot; Валидацию MAC представления состояния не удалось & quot; ошибка после аутентификации Если я закомментирую этот код, он будет работать отлично, поэтому я уверен, что это причина на 1000%.

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

Ваш Ответ

1   ответ
1

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

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

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

Update

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

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

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

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

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

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

https://stackoverflow.com/a/2551810/159270

Я попытаюсь зарегистрировать идентификатор сеанса, как мы увидим ... Я отправлю сообщение после еще нескольких исследований. walther
Это именно то, что я думал, что мой идентификатор сеанса изменился. Однако после некоторого исследования (проверено в веб-инструментах Chrome) кажется, что это не так. Machinkey в моем web.config генерируется этим сайтомaspnetresources.com/tools/machineKey и само по себе (без ViewStateUserKey) работает без проблем. walther
@walther сделайте журнал вашего sessionid, чтобы увидеть, если это изменится.
@walther sessionid связан с cookie пользователя, но является измененным и просроченным. Почему вы не установили прямой cookie пользователя? И, во-вторых, почему вы проверяете IsAuthenticated или нет ... нет причин для обеспечения безопасности только для аутентифицированных пользователей. (по крайней мере, что я делаю в своем коде, я использую куки для всех пользователей)
Ну, Скотт Хансельман имеет этот кусок кода на своем сайте, поэтому я подумал, что это будет хорошо. Первоначально у меня было это без проверки для аутентифицированного пользователя, но это тоже не помогло.hanselman.com/blog/… walther

Похожие вопросы