2010-06-23 5 views
21

내 앱에서 관리자는 사용자 계정을 일시 중지/일시 중단 해제 할 수 있습니다. 다음 코드를 사용하여이 작업을 수행합니다.프로그래밍 방식으로 ASP.NET 사용자를 로그 아웃

MembershipUser user = Membership.GetUser(Guid.Parse(userId)); 
user.IsApproved = false; 
Membership.UpdateUser(user); 

위의 내용은 사용자를 일시 중지하는 데는 문제가 없지만 세션을 취소하지는 않습니다. 따라서 일시 중단 된 사용자는 세션 쿠키가 남아있는 동안 응용 프로그램에 대한 액세스 권한을 유지할 수 있습니다. 모든 수정/

답변

2

일부 일반 페이지에서 유효한 계정인지 확인한 다음 해지 된 경우 Session.Abandon()으로 전화하십시오.

편집 (그냥이 여전히 열려 나타났습니다.) 나는 그것을 할 수 있기 때문에

나는이 작품 알고있다.

마스터 페이지에서 계정 상태를 확인하십시오. 즉, 모든 내비게이션에 이 있음을 의미합니다. 로그 아웃 할 수 있습니다.

(최종) 편집

으로 생각 "나는, 자신의 세션을 종료하고"로 생각하지 마십시오 "자신의 세션 자체를 종료합니다."

+1

현재 사용자의 세션에서만 사용하지 않습니까? 다른 사용자의 세션을 포기하고 싶습니다. 세션 (사용자)과 같은 것입니다. – Testing123

+1

@ Testing123 egrunin은 모든 사용자가 자신의 계정이 유효하지 않은지 확인하기 위해 검사하고, 그렇다면 응용 프로그램이 쿠키를 제거한다는 것을 의미합니다. – guanome

+0

FormsAuthentication.SignOut()이 필요하기 때문에 Downvote; – Juan

6

하면 폼 인증 사용 : '외부'세션에서 세션을 포기하는 방법이

FormsAuthentication.SignOut(); 
+3

그들은 원하고 있습니다. 현재 사용자의 세션이 아닌 다른 세션을 끝내십시오. 따라서 적절하지 않습니다. –

24

없습니다입니다. 각 페이지로드시 데이터베이스를 점검하고 계정이 사용 불가능한 경우 로그 아웃해야합니다. HttpModule을 사용하여이 작업을 수행 할 수 있습니다. 이렇게하면 작업이 조금 더 깨끗해집니다. 예를 들어

:

public class UserCheckModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute); 
    } 

    public void Dispose() {} 

    private void OnPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     // Get the user (though the method below is probably incorrect) 
     // The basic idea is to get the user record using a user key 
     // stored in the session (such as the user id). 
     MembershipUser user = Membership.GetUser(Guid.Parse(HttpContext.Current.Session["guid"])); 

     // Ensure user is valid 
     if (!user.IsApproved) 
     { 
      HttpContext.Current.Session.Abandon(); 
      FormsAuthentication.SignOut(); 
      HttpContext.Current.Response.Redirect("~/Login.aspx?AccountDisabled"); 
     } 
    } 
} 

이 완전한 예를 들어, 및 적응해야합니다 세션에 저장된 키를 사용하여 사용자를 검색하는 방법은 아닙니다, 그러나 이것은 당신이 시작하는 것이다. 사용자 계정이 아직 활성 상태인지 확인하기 위해 각 페이지로드시 추가 데이터베이스 확인이 필요하지만이 정보를 확인할 수있는 다른 방법은 없습니다.

+0

'MembershipUser user = Membership.GetUser (Guid.Parse (HttpContext.Current.Session [ "guid"])))',' 이 줄을 우리가 사용자를 얻는데 사용하는 방법으로 바꾸어야합니까? 데이터베이스 호출처럼? – guanome

+0

@guanome 맞습니다. 맞습니다. 위의 코드 예제는 세션에 사용자 ID를 저장한다고 가정합니다. 이 코드 라인의 목적은 세션에 저장된 값을 사용하여 ID와 같은 데이터베이스에서 사용자를 검색하여 사용자의 상태를 확인할 수있게하는 것입니다. – Mun

2

사용자를 로그 아웃 할 때 FormsAuthenticationTicket을 덮어 쓰는 것도 좋은 방법입니다.

HttpContext context = HttpContext.Current; 

//overwrite the authentication cookie 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, context.User.Identity.Name, DateTime.Now, DateTime.Now.AddDays(-1), false, Guid.NewGuid().ToString()); 
string encrypted_ticket = FormsAuthentication.Encrypt(ticket); 

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted_ticket); 
cookie.Expires = ticket.Expiration; 
context.Response.Cookies.Add(cookie); 

//clear all the sessions 
context.Session.Abandon(); 

//sign out and go to the login page 
FormsAuthentication.SignOut(); 
FormsAuthentication.RedirectToLoginPage(); 
관련 문제