У меня странная проблема с моей веб-страницей входа, когда сеанс входа пользователя теряется иногда после успешного входа.
Когда пользователь получает доступ к следующей странице после входа в систему, она будет перенаправлена обратно на страницу входа в систему, поскольку сеанс входа в систему не существует.
Это происходит примерно в 10% случаев случайным образом (кажется, так) среди многих пользователей, и обычно тот же пользователь, который испытал это, попадет после второй попытки. Мне не кажется, что система была занята, когда это происходит.
Вот процесс входа в систему:
- Пользователь вводит имя пользователя и пароль на странице входа (login. asp), затем учетные данные для входа отправляются со страницы входа (login). . asp) к Asp. Net обработчику входа в систему (LoginHandler.ashx) через вызов javascript Ajax.
- Затем обработчик входа проверяет учетные данные и устанавливает сеанс входа в систему (
Session["CC_VendorInfo"]
), которая включает информацию о пользователе. - Затем обработчик входа отправляет ответ OK на вызов Ajax. После получения ответа OK, javascript при входе в систему. asp отправит пользователя на следующую страницу.
- Когда пользователь запрашивает следующую страницу, сервер пытается получить информацию из сеанса входа (
Session["CC_VendorInfo"]
). Если сеанс равен нулю, он перенаправляет пользователя обратно на страницу входа в систему.
У меня есть некоторый журнал отладки на сервере для распечатки содержимого сеанса входа в систему, который подтверждает, что сеанс успешно установлен в Шаг 2. И у меня также есть журнал, показывающий, что на шаге 4 сеанс входа в систему иногда равен NULL.
Дополнительные примечания : приложение развернуто на стандартной виртуальной машине Windows в Azure, поэтому ограничения управления сеансами, вызванные балансировкой нагрузки, похоже, не относятся к этой проблеме.
Какова возможная причина этой проблемы? Любой ответ приветствуется!
Часть кода в Логин. asp:
function Login() {
$.ajax({
type: "POST",
url: "../Home/LoginHandler.ashx",
data: {
user: $("#UserName").val(),
pswd: $("#PassWord").val()
},
success: function (response) {
ProcessLogin(response);
},
error: function (xhr, status) {
alert("Failed to login.");
}
})
return false;
}
function ProcessLogin(response) {
// ... ...
if (response == 'OK') {
window.location.href = strNextUrl;
} else {
alert("Failed to login.");
}
}
Часть кода в LoginHandler.ashx :
if (CheckCredential(context, sUserName, sPassword))
{
ClsVendorInfo oVendorInfo = new ClsVendorInfo();
oVendorInfo.iVendorID = iVendorID;
oVendorInfo.sUserName = sUserName;
// set the login session here
ClsCommonUI.SetVendorInfoSession(oVendorInfo);
sResp = "0|OK";
}
Функция в классе утилита для установки сеанса входа в систему:
static class ClsCommonUI
{
// ... ...
public static bool SetVendorInfoSession(ClsVendorInfo oVendorInfo)
{
ClsVendorInfo oSessVendorInfo = HttpContext.Current.Session["CC_VendorInfo"] as ClsVendorInfo;
if (oSessVendorInfo != null &&
(oSessVendorInfo.iVendorID != oVendorInfo.iVendorID ||
oSessVendorInfo.iUserID != oVendorInfo.iUserID))
{
DebugLog(oSessVendorInfo,
string.Format("Login Session Changed [{0}] (before): {1}",
HttpContext.Current.Session.SessionID,
oSessVendorInfo.Print()));
}
// update session
HttpContext.Current.Session.Remove("CC_VendorInfo");
HttpContext.Current.Session["CC_VendorInfo"] = oVendorInfo.Clone();
oSessVendorInfo = HttpContext.Current.Session["CC_VendorInfo"] as ClsVendorInfo;
// I can see the session content being print out in the debug log
DebugLog(oSessVendorInfo,
string.Format("SetVendorInfoSession [{0}]: {1}",
HttpContext.Current.Session.SessionID,
oSessVendorInfo.Print()));
// ... ...
return true;
}
// ... ...
}
Когда пользователь запрашивает следующую страницу , вот код проверьте сеанс входа в систему :
public static int GetVendorInfo(HttpRequest oReq,
ClsDBAccess oDBAccess,
out ClsVendorInfo oVendorInfo,
[CallerFilePath] string sCallerFileName = "")
{
HttpContext context = HttpContext.Current;
ClsVendorInfo oSessionVendorInfo = context.Session["CC_VendorInfo"] as ClsVendorInfo;
if (oSessionVendorInfo != null &&
oSessionVendorInfo.iVendorID != 0)
{
// continue processing
//... ...
}
else
{
// No Session - go back to login
RedirectToLogin(HttpContext.Current);
}
}