Я тестирую WebRole с экземпляры кратных в Windows Azure для проверки балансировки нагрузки. Код, который я должен аутентифицировать пользователей, является следующим:Azure: Объект HttpContext.Current.Session используется всеми экземплярами WebRole?
protected void Application_AcquireRequestState(Object sender, EventArgs e)
{
HttpCookie authCookie =
HttpContext.Current.Request.Cookies
[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
FormsAuthenticationTicket authTicket =
FormsAuthentication.Decrypt(authCookie.Value);
SetUserCredentials(authTicket.Name, authTicket.UserData);
}
}
private void SetUserCredentials(string userName, string securityConfig)
{
Credentials auth = GetSessionCredentials();
if (auth == null && HttpContext.Current.Session != null)
{
log.DebugFormat("Credentials not available in session variable. Building credentials to __SessionSID.");
SID sid =
AuthenticationHelper.Get().
GetAuthenticatedSIDFromName(userName, securityConfig);
if (sid == null)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
return;
}
auth = new Credentials(sid);
if (HttpContext.Current.Session != null)
{
log.DebugFormat("Saving credentials in a session variable");
HttpContext.Current.Session.Add("__SessionSID", auth);
}
}
log.DebugFormat("Time setting user credentials for user: {0} {1}ms", userName, Environment.TickCount - ini);
}
private Credentials GetSessionCredentials()
{
if (HttpContext.Current == null)
return null;
if (HttpContext.Current.Session == null)
return null;
return HttpContext.Current.Session["__SessionSID"] as Credentials;
}
Вот мои вопросы. Я проверил WebRole с двумя примерами в Azure:
- Предположим, что я вхожу в систему и экземпляр WebRole A, выполняет аутентификацию.
- Когда я делаю новые запросы, и запрос отправляется на экземпляр WebRole B, authTicket в
Current.Request.Cookies
иHttpContext.Current.Session["__SessionSID"]
были в порядке.
Кто-то может это объяснить? Я провел сеанс между всеми экземплярами WebRole?
Но код, который я вставил выше, работает без каких-либо пользовательских поставщиков. Мой оригинальный вопрос был почему? –
Ваш код проверяет, что сеанс не является нулевым (что не должно быть независимо от состояния сеанса). Вы также добавляете некоторые значения в дату сеанса, но вы не проверяете/не регистрируете/не сравниваете их нигде позже, чтобы убедиться, что вы получаете одинаковое значение в разных экземплярах. – haim770