문제

MVC4를 실행하고 인증을 위해 간단한 회원 자격을 사용하여 프로젝트가 있습니다. 사용자가 하나의 브라우저에 로그인하도록 허용하고 싶습니다. 이를 사용자에게 투명하게 만들려면 사용자가 로그인 할 때마다 다른 인증 된 브라우저가 로그 아웃 할 수있는 방법이 필요합니다. 이는 두 사용자가 동일한 로그인을 사용하려고 노력하고있는 경우,이를 통해 서로를 계속 걷어차는 것을 의미합니다. 매우 비생산적입니다.

지금 사용자가 한 번 로그인 할 수 있도록 설정했지만 해당 사용자가 브라우저를 닫고 다른 컴퓨터로 이동할 경우 30 분 동안 잠글 수 있습니다. 불필요한 지원 호출.

데이터베이스에서 일종의 식별자를 추적하고 각 요청과 일치하는지 확인하는 것을 확인해야합니다. 그렇지 않으면 로그 아웃됩니다. 어쩌면 일종의 쿠키를 추가 할 수도 있습니다.

누구든지 이에 대한 우아한 해결책이 있으면 감사합니다!

이것은 현재 사용자를 하나의 로그인으로 만 잠글 수있는 것입니다.

로그인 :

[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");
}
.

나는 세션이라는 용어를 사용하여 그것을 제거했다. 나는 사용자의 세션을 삭제하지 않고 웹 보안을 사용하여 권한을 유효하지 않습니다.

도움이 되었습니까?

해결책

이 제품이 내장되어 있습니다. 혼자서 몇 가지 방법론을 개발해야합니다. 기본적으로 두 조각이 필요합니다 :

  1. 요청을 통해 로그인 한 사용자를 추적하는 방법. 이는 특정 사용자 이름이 로그인했는지 확인하는 데 사용할 수있는 사용자 이름 열이있는 테이블만큼 간단 할 수 있습니다. 로그인 / 물론 로그인 / 로그 아웃과 동기화되어야합니다. 사용자의 세션 ID를 저장하십시오. 다음 조각에 대해 필요합니다 :

  2. 어떤 저장소에 있는지에서 세션을 제거하는 메커니즘. 일치하는 ID로 테이블 세션 테이블에서 행을 삭제할 수 있으므로 SQL 세션을 사용하는 경우 가장 쉽습니다. ASP.NET을 사용 하여이 작업을 수행 할 수있는 방법은 없으므로 데이터베이스를 직접 쿼리하고 저장 프로 시저를 사용해야합니다.

  3. 사용자가 로그인 할 때 테이블에 사용자 이름과 세션 ID 또는 다른 지속 된 저장소에 대한 사용자 이름 및 세션 ID를 기록하는 것입니다. 누군가가 로그인을 시도 할 때이 상점이 시도중인 사용자 이름을 확인 하고이 경우에 해당하는 세션을 삭제하십시오. 다음에 해당 세션을 사용하면 페이지에 액세스하려고하면 세션 쿠키가 유효한 세션과 더 이상 일치하지 않으며 로그 아웃 한 것처럼 처리됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top