我正在開發一個管理員用戶可以在系統中以其他用戶類型登錄的網站。我在那裏需要跟蹤當前的「顯示」用戶和當前的「登錄」用戶。最明顯的地方似乎是會話,但你有挑戰保持會話超時與認證超時同步。以最佳做法登錄?
見我的問題在這裏: MVC session expiring but not authentication
什麼是處理這類場景的最佳做法?
我正在開發一個管理員用戶可以在系統中以其他用戶類型登錄的網站。我在那裏需要跟蹤當前的「顯示」用戶和當前的「登錄」用戶。最明顯的地方似乎是會話,但你有挑戰保持會話超時與認證超時同步。以最佳做法登錄?
見我的問題在這裏: MVC session expiring but not authentication
什麼是處理這類場景的最佳做法?
除了爲超時/安全通常的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");
}
然後我退出()控制器方法我說:
public ActionResult Logout()
{
Session["currentPlayer"] = null;
FormsAuthentication.SignOut();
return RedirectToAction("Index", "Home", new { l = "1"}); //Your login page
}
對於加工餅乾,我有:
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;
}
您在每個控制器操作中都有相同的代碼?作爲一個整體在控制器上使用過濾器不是更好嗎? –
是的,先生。大約3年前向青少年開發者打招呼。 –
如果你不想使用會話,那麼我會數據庫。 – user1477388
我很想知道你是否已經解決了這個問題,因爲我處於類似的情況,並且不知道如何實現它。謝謝 – mrmashal
我相信我在這裏使用了session的解決方案,儘管您也可以使用通常爲REST API(通常使用JWT https://jwt.io/)保存在cookie中的基於令牌的技術。 JWT令牌安全可靠,因爲它包含校驗和以確保數據不會被篡改 –