Переменные сеанса, потерянные после переадресации - PullRequest
0 голосов
/ 18 июня 2019

У меня есть сайт MVC, который использует провайдеров членства для аутентификации на нескольких доменах.

Я использую SESSION для хранения displayName моего пользователя, которое я затем отображаю в своем _Layout.cshtml

Это все прекрасно работает на моем локальном хосте, но когда я развертываю свое приложение на VM / Server, SESSION становится пустым, и я получаю объект не установлен на экземпляр объекта, и ошибка указывает на строку на моей странице макета, где я отобразить полное имя пользователя. Это происходит после истечения времени ожидания сеанса, когда пользователь запрашивает новую страницу, и ему необходимо снова войти в систему.

Вот мой метод входа:

    if (!ModelState.IsValid)
    {
        return View(model);
    }

    Session["UserName"] = "Unknown User";
    Logger.Instance.Info("Setting username to unknown user");
    var msg = string.Empty;
    var user = _userSvc.GetLoginUserData(model.Username, out msg);
    if (!string.IsNullOrEmpty(msg)) 
    {
        Logger.Instance.Info("getting user info but error returned: "+msg);
        ModelState.AddModelError("", msg);
        return View(model);
    }

    Logger.Instance.Info("User was found "+user.EMAIL);
    foreach (MembershipProvider provider in Membership.Providers)
    {

        var username = user.LEGACY_USERNAME;
        if (provider.Name == "ADENTMembershipProvider") username = user.ENT_USERNAME;
        try
        {
            Logger.Instance.Info("Authenticating user "+username+" to "+provider.Name);
            if (provider.ValidateUser(username, model.Password))
            {
               Session["UserName"] = user.FIRST_NAME + ' ' + user.LAST_NAME;
                Logger.Instance.Info("User authenticated " + Session["UserName"]);
                var authTicket = new FormsAuthenticationTicket(
                1, // version
                user.ID.ToString(), // user name
                DateTime.Now, // created
                DateTime.Now.AddMinutes(2), // expires
                false, // persistent?
                user.ROLE // can be used to store roles
                );

                string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

                var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
                Response.Cookies.Add(authCookie);

                if (returnUrl != null && returnUrl != "/")
                {
                    Logger.Instance.Info("Redirecting user to " + returnUrl);
                    Response.Redirect(returnUrl);
                }                           
                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }
        }
        catch (Exception ex)
        {
            Logger.Instance.Error("Error authenticating user " + username + " to " + provider.Name, ex); 
        }                
    }
    SynLogger.Instance.Info("User could not be authenticated " );
    // User was not authenticated in any of the AD
    ModelState.AddModelError("", "Invalid login attempt. The username or password provided is incorrect.");
    return View(model);             

Вот строка в моем макете, которая вызывает проблему, когда время сеанса истекло и пользователь повторно входит в систему:

<a href="#">Hello @Html.Raw(Session["UserName"].ToString())</a>

Не уверен, почему это работает на моей машине разработки, но не при развертывании на сервере.

Есть ли другой способ сохранить имя пользователя, отличное от SESSION, чтобы я мог получить к нему доступ к своей странице макета?

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