我的登录网页出现一个奇怪的问题,成功登录后,用户的登录会话偶尔丢失。
用户登录后访问下一页时,由于登录会话不存在,它将被重定向回登录页面。
许多用户中大约10%的时间是随机发生的(似乎如此),通常,经历此操作的同一用户在第二次尝试后就会进入。在我看来,发生这种情况时系统并不忙。
这是登录过程:
Session["CC_VendorInfo"]
)。Session["CC_VendorInfo"]
中)。如果会话为空,则它将
将用户重定向回登录页面。我在服务器上有一些调试日志,用于打印出登录会话的内容,这证明该会话已在步骤2中成功设置。并且我还有日志显示,在步骤4中,登录会话有时为NULL。>
更多说明: 该应用程序已部署在Azure中的标准Windows虚拟机上,因此,由负载平衡引起的会话管理限制似乎不适用于此问题。
此问题的可能原因是什么?任何答案都非常感谢!
Login.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);
}
}
答案 0 :(得分:0)
如果这不是您的问题,我可以删除此答案。
Chrome对Cookie的新SameSite更改即将删除或已经删除。如果您在Cookie上没有SameSite属性,则chrome会直接删除该Cookie。如果将其设置为“宽松”,则所有跨域iframe都会删除该Cookie。如果此方法在IE中正常运行,则可能是您的问题。如果您使用SameSite = None,则跨域iframe可以运行,但是旧版浏览器也可能会停止运行...