1
我正在測試一個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;
}
這裏是我的問題。我使用Azure中的兩個實例測試了WebRole:
- 假設我登錄並且WebRole實例A執行身份驗證。
- 當我發出新的請求,並且請求轉到WebRole實例B時,
Current.Request.Cookies
和HttpContext.Current.Session["__SessionSID"]
中的authTicket正常。
有人能解釋嗎?我在所有WebRole實例之間共享會話?
但我粘貼上面的代碼,它的工作沒有實現任何自定義提供程序。我原來的問題是爲什麼? – 2013-03-07 12:58:33
您的代碼只檢查會話是否爲空(不應該與會話狀態無關)。 您還在會話日期中添加了一些值,但您不會稍後檢查/記錄/比較它們以驗證您是否跨實例獲得相同的值。 – haim770 2013-03-07 13:01:36