Установка ViewStateUserKey дает мне ошибку "Проверка отказа в просмотре"
В моем классе BasePage
у меня есть следующее: все мои ASPX-страницы получаются из:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
ViewStateUserKey = Session.SessionID;
}
У меня также есть набор machineKey
в Web.config
. Я не думаю, что эта ошибка связана с веб-фермой, потому что это происходит и на моей машине dev.
Мой хост теперь обновлен до .NET 3.5 SP1. После этого обновления каждый раз, когда я скомпилирован с установкой ViewStateUserKey
выше, я постоянно получаю ошибку "Validation of viewstate MAC failed" при каждой обратной передаче.
Что я здесь делаю неправильно? Является ли эта настройка еще более необходимой при обновлении последней версии?
Ответы
Ответ 1
ОК - Я опаздываю до разговора, но как это правильный ответ? Это применяется только в случае пользователей, прошедших проверку подлинности, и используя ViewStateUserKey
, поскольку имя пользователя намного проще угадывать, чем идентификатор идентификатора сеанса.
BTW, если вы хотите "исправить" код вверху, используйте идентификатор сеанса, однако вы должны установить переменную сеанса, чтобы идентификатор сеанса переставал меняться каждый раз. Ex.
Session["Anything"] = DateTime.Now
ViewStateUserKey = Session.SessionID;
Это, конечно, предполагает, что вы собираетесь использовать сеансы, иначе вам понадобится другой ключ для использования, например, имя пользователя или любое другое руководство, хранящееся в файле cookie.
Ответ 2
Я искал вокруг совсем немного, чтобы найти окончательную причину проблемы.
Этот пост от Microsoft действительно помог объяснить все разные причины.
http://support.microsoft.com/kb/2915218
Причина 4 - это то, что мы приземлились, на котором находится недопустимый ViewStateUserKeyValue
Настройка ViewStateUserKey на Session.SessionID или User.Identity.Name не работает для нас.
Мы прерывисто получили ошибку проверки из-за следующего.
Когда пул приложений reset от IIS, сеанс возобновляется, вызывая ошибку.
Мы оставляем сессию для входа в систему, чтобы избежать фиксации сеанса, что также приводит к ошибке при входе в систему.
Что в конечном итоге сработало для нас, было решение на основе файлов cookie, которое теперь представлено в VS2012.
public partial class SiteMaster : MasterPage
{
private const string AntiXsrfTokenKey = "__AntiXsrfToken";
private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
private string _antiXsrfTokenValue;
protected void Page_Init(object sender, EventArgs e)
{
//First, check for the existence of the Anti-XSS cookie
var requestCookie = Request.Cookies[AntiXsrfTokenKey];
Guid requestCookieGuidValue;
//If the CSRF cookie is found, parse the token from the cookie.
//Then, set the global page variable and view state user
//key. The global variable will be used to validate that it matches in the view state form field in the Page.PreLoad
//method.
if (requestCookie != null
&& Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
{
//Set the global token variable so the cookie value can be
//validated against the value in the view state form field in
//the Page.PreLoad method.
_antiXsrfTokenValue = requestCookie.Value;
//Set the view state user key, which will be validated by the
//framework during each request
Page.ViewStateUserKey = _antiXsrfTokenValue;
}
//If the CSRF cookie is not found, then this is a new session.
else
{
//Generate a new Anti-XSRF token
_antiXsrfTokenValue = Guid.NewGuid().ToString("N");
//Set the view state user key, which will be validated by the
//framework during each request
Page.ViewStateUserKey = _antiXsrfTokenValue;
//Create the non-persistent CSRF cookie
var responseCookie = new HttpCookie(AntiXsrfTokenKey)
{
//Set the HttpOnly property to prevent the cookie from
//being accessed by client side script
HttpOnly = true,
//Add the Anti-XSRF token to the cookie value
Value = _antiXsrfTokenValue
};
//If we are using SSL, the cookie should be set to secure to
//prevent it from being sent over HTTP connections
if (FormsAuthentication.RequireSSL &&
Request.IsSecureConnection)
responseCookie.Secure = true;
//Add the CSRF cookie to the response
Response.Cookies.Set(responseCookie);
}
Page.PreLoad += master_Page_PreLoad;
}
protected void master_Page_PreLoad(object sender, EventArgs e)
{
//During the initial page load, add the Anti-XSRF token and user
//name to the ViewState
if (!IsPostBack)
{
//Set Anti-XSRF token
ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
//If a user name is assigned, set the user name
ViewState[AntiXsrfUserNameKey] =
Context.User.Identity.Name ?? String.Empty;
}
//During all subsequent post backs to the page, the token value from
//the cookie should be validated against the token in the view state
//form field. Additionally user name should be compared to the
//authenticated users name
else
{
//Validate the Anti-XSRF token
if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
|| (string)ViewState[AntiXsrfUserNameKey] !=
(Context.User.Identity.Name ?? String.Empty))
{
throw new InvalidOperationException("Validation of
Anti-XSRF token failed.");
}
}
}
}
Источник
Ответ 3
Я исправил его, изменив код на:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (User.Identity.IsAuthenticated)
ViewStateUserKey = User.Identity.Name;
}
Ответ 4
Можно ли отключить MAC-кодирование ViewState с атрибутом EnableViewStateMac @Page?
Ответ 5
ОЧЕНЬ Странно, у меня тоже была аналогичная проблема в течение 3 дней, и теперь я решил ее.
1. Я включил проверку подлинности на базе и имел ssl false
<forms defaultUrl="~/" loginUrl="~/Account/Login.aspx" requireSSL="false" timeout="2880" />
-
но в моем теге httpcookies у меня было requireSSL = true. Поскольку в Site.Master.cs он использует файлы cookie для установки ViewStateUserKey, у него возникли проблемы
-
Следовательно, я получал ошибку.
-
Я изменил это на false и перезапустил веб-приложение, теперь все это хорошо.