Войти в качестве лучших практик?

Я разрабатываю сайт, на котором пользователь-администратор сможет войти в систему как другие типы пользователей в системе. У меня есть необходимость отслеживать текущего «отображаемого» пользователя и текущего «вошедшего в систему» ​​пользователя. Наиболее очевидным местом кажется сеанс, но тогда у вас возникают проблемы с синхронизацией тайм-аута сеанса с тайм-аутом аутентификации.

Смотрите мой вопрос здесь: Сессия MVC истекает, но не проходит аутентификацию

Каковы наилучшие методы обработки такого сценария?


person Josh Russo    schedule 05.09.2012    source источник
comment
Если вы не хотите использовать сеансы, я бы создал базу данных.   -  person user1477388    schedule 05.09.2012
comment
Мне не терпится узнать, как вы решили проблему, так как я нахожусь в похожей ситуации и не знаю, как ее реализовать. Спасибо   -  person mrmashal    schedule 16.04.2016
comment
Я полагаю, что здесь я использовал сеанс для решения, хотя вы также можете использовать технику на основе токенов, обычно зарезервированную для REST API (я обычно использую JWT jwt.io), сохраненный в файле cookie. На токен JWT можно положиться, поскольку он включает контрольную сумму, чтобы гарантировать, что данные не будут подделаны.   -  person Josh Russo    schedule 16.04.2016


Ответы (1)


Помимо обычных настроек web.config для тайм-аутов/безопасности:

<location path="Portal/Dashboard">
<system.web>
  <authorization>
    <deny users="?" />
  </authorization>
</system.web>
</location>

<authentication mode="Forms">
  <forms loginUrl="~/Portal/Logout" timeout="10" />
</authentication>

Вот как я справляюсь с этим в своих контроллерах:

        loggedInPlayer = (Player)Session["currentPlayer"];
        if (loggedInPlayer == null)
        {
            loggedInPlayer = Common.readCookieData(User.Identity);
        }
        if (loggedInPlayer.UserID > 0)
        {
          //Dude's signed in, do work here
        }
     else
        {
            return PartialView("Logout");
        }

И затем для моего метода контроллера LogOut() я говорю:

public ActionResult Logout()
    {
        Session["currentPlayer"] = null;
        FormsAuthentication.SignOut();
        return RedirectToAction("Index", "Home", new { l = "1"}); //Your login page
    }

Для обработки файлов cookie у меня есть:

public static Player readCookieData(System.Security.Principal.IIdentity x)
    {
        Player loggedInPlayer = new Player();
        if (x.IsAuthenticated)
        {
            loggedInPlayer.UserID = 0;
            if (x is FormsIdentity)
            {
                FormsIdentity identity = (FormsIdentity)x;
                FormsAuthenticationTicket ticket = identity.Ticket;
                string[] ticketData = ticket.UserData.Split('|');
                loggedInPlayer.UserID = Convert.ToInt32(ticketData[0]);
                loggedInPlayer.UserFName = ticketData[1];
                loggedInPlayer.UserLName = ticketData[2];
            }
        }
        else
        {
            loggedInPlayer.UserID = 0;
            loggedInPlayer.UserFName = "?";
            loggedInPlayer.UserLName = "?";
        }
        return loggedInPlayer;
    }
person Code Monkey    schedule 05.09.2012
comment
У вас есть один и тот же код в каждом действии контроллера? Не лучше ли использовать фильтр на контроллере в целом? - person Thomas Boby; 05.01.2016
comment
Да сэр. Передай привет младшему разработчику около 3 лет назад. - person Code Monkey; 30.01.2016