Asp.net mvc 登录为。。。最佳实践?

Asp.net mvc 登录为。。。最佳实践?,asp.net-mvc,forms-authentication,session-timeout,Asp.net Mvc,Forms Authentication,Session Timeout,我正在开发一个网站,管理员用户将能够登录系统中的其他用户类型。我需要跟踪当前的“显示”用户和当前的“登录”用户。最明显的地方似乎是会话,但要使会话超时与身份验证超时保持同步,您会遇到一些挑战 请看我的问题: 处理此类场景的最佳实践是什么?除了超时/安全的常用web.config设置外: <location path="Portal/Dashboard"> <system.web> <authorization> <deny users="?

我正在开发一个网站,管理员用户将能够登录系统中的其他用户类型。我需要跟踪当前的“显示”用户和当前的“登录”用户。最明显的地方似乎是会话,但要使会话超时与身份验证超时保持同步,您会遇到一些挑战

请看我的问题:


处理此类场景的最佳实践是什么?

除了超时/安全的常用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>
对于LogOut()控制器方法,我说:

public ActionResult Logout()
    {
        Session["currentPlayer"] = null;
        FormsAuthentication.SignOut();
        return RedirectToAction("Index", "Home", new { l = "1"}); //Your login page
    }
对于处理cookies,我有:

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;
    }

如果你不想使用会话,那么我会将其存入数据库。我很想知道你是否/如何解决了这个问题,因为我处于类似的情况,不知道如何实现它。谢谢,我相信我在这里使用了session作为解决方案,不过您也可以使用通常为restapi保留的基于令牌的技术(我通常使用JWT),该技术存储在cookie中。JWT令牌是可以安全依赖的,因为它包含一个校验和,以确保数据不被篡改。在每个控制器操作中都有相同的代码?在整个控制器上使用过滤器不是更好吗?是的,先生。三年前跟我打个招呼。
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;
    }