質問

MVC4を実行し、認証のための簡単なメンバーシップを使用しているプロジェクトを持っています。ユーザーが1つのブラウザにログインすることを許可したいだけです。これをユーザーに透過的にするためには、ユーザーがログインするたびに、他の認証されたブラウザをログアウトさせる方法が必要です。これは、2人のユーザーが同じログインを使用しようとしている場合、それらを継続的に蹴り上げることになります。非常に未生産性。

今、ユーザーが1回ログインするだけでなく、そのユーザーがブラウザを閉じて別のコンピュータに移動することを許可するように設定しました。これにより、これを作成できるようにするには、30分間ロックアウトされます。不要なサポートコール。

私はデータベース内のある種の識別子を追跡し、それが各要求とそれがログアウトされていることを確認することを確認する必要があると思います。たぶん、いくつかのクッキーを追加してください。

誰かがこれに優雅な解決策を持っているならば、私はそれを感謝します!

これは、私が現在1つのログインしかログインしかログインしているために使用しているものです:

ログイン:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    string sKey = model.UserName;
    string sUser = Convert.ToString(System.Web.HttpContext.Current.Cache[sKey]);

    if (sUser == null || sUser == String.Empty)
    {
        TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
        System.Web.HttpContext.Current.Cache.Insert(sKey, sKey, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);

        Session["user"] = model.UserName;

        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }
    else
    {
        ModelState.AddModelError("", "You are already logged in.");
   }

    return View(model);
}
.

global.asax

protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
    if (HttpContext.Current.Session != null)
    {
        if (Session["user"] != (null)) // e.g. this is after an initial logon
        {
            string sKey = (string)Session["user"];
            // replace the last hit with current time
            // Accessing the Cache Item extends the Sliding Expiration automatically
            string sUser = (string)HttpContext.Current.Cache[sKey];
        }
    }
}
.

ログアウト:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    UserProfile user = db.UserProfiles.SingleOrDefault(s => s.UserName == User.Identity.Name);
    string sKey = user.UserName;
    System.Web.HttpContext.Current.Cache.Remove(sKey);
    WebSecurity.Logout();
    return RedirectToAction("Start", "Home");
}
.

私はその用語セッションを使用して削除しました。ユーザーのセッションを削除しようとしていませんが、Webセキュリティを使用して自分の権限が無効になります。

役に立ちましたか?

解決

これには内蔵されていません。あなたはあなた自身でいくつかの方法論を開発する必要があります。基本的に2個必要になるでしょう:

  1. 要求間でログインしているユーザーを追跡する方法。これは、特定のユーザー名がログインしているかどうかを判断するために使用できるユーザー名列を持つテーブルと同じくらい簡単です。あなたのログイン/ログアウトと同期してこれを保存する必要があります。ユーザーのセッションIDを保存します。あなたは次の作品のためにそれを必要とするでしょう:

  2. セッションを削除するメカニズムに存在します。これは、SQLセッションを使用している場合に最も簡単になります。 ASP.NETを直接これを行う方法はありませんので、データベースに直接照会する必要があるため、ストアドプロシージャなどを使用する必要があります。

  3. そのため、一般的なアイデアは、ユーザーがログインすると、ユーザー名とセッションIDをテーブルまたはその他の永続ストアに記録することになります。誰かがログインしようとすると、このストアをチェックしている場合は、試行されているユーザー名が存在する場合は、これに対応するセッションを削除してください。次回そのセッションがページにアクセスしようとしたときに、セッションCookieは有効なセッションと一致しなくなり、ログアウトされているかのように扱われます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top