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, и попытается сделать любое сообщение, получит ошибку. Так что подумайте о решении, как это справиться с ними