Сессия иногда теряется после успешного входа - PullRequest
0 голосов
/ 04 февраля 2020

У меня странная проблема с моей веб-страницей входа, когда сеанс входа пользователя теряется иногда после успешного входа.

Когда пользователь получает доступ к следующей странице после входа в систему, она будет перенаправлена ​​обратно на страницу входа в систему, поскольку сеанс входа в систему не существует.

Это происходит примерно в 10% случаев случайным образом (кажется, так) среди многих пользователей, и обычно тот же пользователь, который испытал это, попадет после второй попытки. Мне не кажется, что система была занята, когда это происходит.

Вот процесс входа в систему:

  1. Пользователь вводит имя пользователя и пароль на странице входа (login. asp), затем учетные данные для входа отправляются со страницы входа (login). . asp) к Asp. Net обработчику входа в систему (LoginHandler.ashx) через вызов javascript Ajax.
  2. Затем обработчик входа проверяет учетные данные и устанавливает сеанс входа в систему ( Session["CC_VendorInfo"]), которая включает информацию о пользователе.
  3. Затем обработчик входа отправляет ответ OK на вызов Ajax. После получения ответа OK, javascript при входе в систему. asp отправит пользователя на следующую страницу.
  4. Когда пользователь запрашивает следующую страницу, сервер пытается получить информацию из сеанса входа ( 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);
        }
    }

1 Ответ

0 голосов
/ 04 февраля 2020

Если это не ваша проблема, я могу удалить этот ответ.

Chrome Новое изменение SameSite для файлов cookie уже прекращено или уже сделано. Если у вас нет атрибута SameSite для повара ie, chrome просто бросит повара ie сразу. Если установлено значение Lax, то все междоменные iframes будут отбрасывать команду cook ie. Если это нормально работает в IE, то это, вероятно, ваша проблема. Если вы используете SameSite = None, междоменный iframe работает, но старые браузеры тоже могут перестать работать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...