Ich habe ziemlich viel gesucht, um die endgültige Ursache des Problems zu finden. Dieser Beitrag von Microsoft hat wirklich geholfen, die verschiedenen Ursachen zu erklären. http://support.microsoft.com/kb/2915218 Ursache 4 ist das, was wir haben, auf dem gelandet ist eine ungültige ViewStateUserKeyValue
Einstellung ViewStateUserKey zu Session.SessionID oder User.Identity.Name nicht für uns nicht funktioniert.
Wir haben den Validierungsfehler aufgrund des Folgenden intermittierend erhalten. Wenn der Anwendungspool von IIS zurückgesetzt wird, wird die Sitzung erneuert, wodurch der Fehler verursacht wird. Wir löschen die Sitzung bei der Anmeldung, um eine Sitzungsfixierung zu vermeiden, was ebenfalls zu einem Fehler beim Login führt.
Was schließlich für uns funktionierte, war eine Cookie-basierte Lösung, die jetzt in VS2012 bereitgestellt wird.
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.");
}
}
}
}
Source
Eine Notiz hinzugefügt, manchmal sehe ich die Sitzungs-ID jedes Mal ändern, bis die Sitzung verwendet wird, und manchmal wird das Sitzungs-Cookie sofort an den Client gesendet, ohne die Sitzung scheinbar zu verwenden. Ich bin mir nicht 100% sicher, warum, aber ich habe es bemerkt. –
Das war sehr hilfreich. Ich wusste nicht, dass ASP Sitzung nicht behält, wenn nichts darin gespeichert wird. – Reza