管理者ユーザーがシステム内の他のユーザータイプとしてログインできるサイトを開発しています。私は、現在の「表示」ユーザーと現在の「ログイン」ユーザーを追跡する必要があるためです。最も明白な場所はセッションのようですが、セッションのタイムアウトを認証のタイムアウトと同期させるのは困難です。
ここで私の質問を参照してください: MVCセッションの有効期限が切れていますが認証はありません
この種のシナリオを処理するためのベストプラクティスは何ですか?
管理者ユーザーがシステム内の他のユーザータイプとしてログインできるサイトを開発しています。私は、現在の「表示」ユーザーと現在の「ログイン」ユーザーを追跡する必要があるためです。最も明白な場所はセッションのようですが、セッションのタイムアウトを認証のタイムアウトと同期させるのは困難です。
ここで私の質問を参照してください: MVCセッションの有効期限が切れていますが認証はありません
この種のシナリオを処理するためのベストプラクティスは何ですか?
タイムアウト/セキュリティの通常の 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
}
私が持っているクッキーを処理するために:
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;
}