로그인시 다른 모든 브라우저를 기록하십시오
-
20-12-2019 - |
문제
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");
}
.
나는 세션이라는 용어를 사용하여 그것을 제거했다. 나는 사용자의 세션을 삭제하지 않고 웹 보안을 사용하여 권한을 유효하지 않습니다.
해결책
이 제품이 내장되어 있습니다. 혼자서 몇 가지 방법론을 개발해야합니다. 기본적으로 두 조각이 필요합니다 :
-
요청을 통해 로그인 한 사용자를 추적하는 방법. 이는 특정 사용자 이름이 로그인했는지 확인하는 데 사용할 수있는 사용자 이름 열이있는 테이블만큼 간단 할 수 있습니다. 로그인 / 물론 로그인 / 로그 아웃과 동기화되어야합니다. 사용자의 세션 ID를 저장하십시오. 다음 조각에 대해 필요합니다 :
-
어떤 저장소에 있는지에서 세션을 제거하는 메커니즘. 일치하는 ID로 테이블 세션 테이블에서 행을 삭제할 수 있으므로 SQL 세션을 사용하는 경우 가장 쉽습니다. ASP.NET을 사용 하여이 작업을 수행 할 수있는 방법은 없으므로 데이터베이스를 직접 쿼리하고 저장 프로 시저를 사용해야합니다.
사용자가 로그인 할 때 테이블에 사용자 이름과 세션 ID 또는 다른 지속 된 저장소에 대한 사용자 이름 및 세션 ID를 기록하는 것입니다. 누군가가 로그인을 시도 할 때이 상점이 시도중인 사용자 이름을 확인 하고이 경우에 해당하는 세션을 삭제하십시오. 다음에 해당 세션을 사용하면 페이지에 액세스하려고하면 세션 쿠키가 유효한 세션과 더 이상 일치하지 않으며 로그 아웃 한 것처럼 처리됩니다.