2011-01-05 6 views
3

MVC2 기본 프로젝트에 속한 MembershipProvider를 사용하고 있습니다.현재 사용자가 아닌 여러 Membership 사용자를 로그 오프하는 방법은 무엇입니까?

사용자 이름 목록을 가져와 사용자를 로그 오프하고 필요할 경우 세션을 삭제할 수 있기를 바랍니다. 나는 내가 로그 아웃 할 사용자를 관련 세션 및/또는 signout 방법을 사용할 필요가 있다고 생각

foreach(string userName in UserNames) 
{ 
    MembershipProvider MembershipProvider = new MembershipProvider(); 
    MembershipUser membershipUser = MembershipProvider.GetUser(userName, true); 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

,하지만 난 그이 될 경우 확실하지 오전 : 내가 올 것 같다 수있는 가장 가까운이있다.

이 작업을 수행하는 적절한 방법은 무엇입니까?

+0

그게 작동하지 않습니다 ... 세션.Abandon()은 현재 HttpContext에 대한 것입니다. 각 사용자의 경우가 아닙니다. – turtlepick

답변

0

이가는 MembershipProvider에 너무 많은 관련이없는 것으로 밝혀졌다,하지만 FormsService에 :

가장 좋은 방법은하여 Application_AuthenticateRequest 이벤트에 해당 배열에 대한 현재 사용자를 확인하고 거기에 그들에 서명합니다. 내 마지막 해결책은 여기에 게시 된 다른 두 가지 답변의 일종 인 것으로 판명되었습니다.

계정 컨트롤러에서 내 자신의 FormsAuthenticationTicket을 LogOn 작업으로 만들었습니다. 사용자의 인증 된 세션에 대한 고유 식별자를 생성하고 해당 식별자를 데이터베이스에 저장합니다. 신뢰할 수있는 조회를 위해 auth 티켓의 UserData 부분에 사용자 ID를 추가했습니다. 기본적으로 인증 티켓에는 사용자 이름 만 포함되었습니다. FormsAuthenticationTicket은 사용자 로그온 성공시 쿠키에 저장됩니다.

기본적으로 모든 것은 FormsService.SignIn (model.UserName, model.RememberMe)을 대체합니다.

또한 Global.asax에서 public void Application_ReleaseRequestState (개체 보낸 사람, EventArgs args)를 추가했습니다. 이 기능을 확장하는 것으로 간주되는지 또는 무시할 것으로 보이지 않으므로 확실하지 않습니다. Application_ReleaseRequestState의 내부에서 사용자의 FormsAuthenticationTicket을 쿠키에서 가져옵니다. 그런 다음 auth 티켓을 해독하고 티켓의 UserData 부분에서 사용자의 UserID를 가져옵니다. 그런 다음 인증 티켓이 아직 유효한지 데이터베이스에 요청합니다. 티켓이 유효하지 않으면 사용자의 쿠키가 만료되도록 설정합니다.

강제로 사용자를 로그 오프하려면 데이터베이스에서 인증 티켓 만료 날짜를 변경하거나 데이터베이스에서 인증 티켓의 사용 안 함 비트를 전환 할 수 있습니다. 어쨌든 Application_ReleaseRequestState가 인증 티켓이 유효한지 데이터베이스에 묻는 경우 인증되지 않습니다. 따라서 쿠키는이 체크가 이루어진 후 사용자가 방문한 다음 페이지에서 만료되도록 설정됩니다.

1

나는 이것을했을 때 회원 공급자를 사용하지 않았지만 기본적으로 사용자가 로그온 할 때 데이터베이스에 방문한 SessionId, Username 및 lastPage를 저장했습니다. 각 페이지는 현재 SessionID를 사용하여 사용자 이름을 얻었고 현재 사용자의 디스플레이 잔고와 같은 관련 사용자 이름을 처리합니다. 세션에 대해 유효한 사용자가 없으면 로그온 페이지로 돌아갑니다.

이렇게하면 사용자가 웹 사이트를 통해 진행되는 것을 볼 수 있었고 원하는 사람을 수동으로 연결 해제하고 사용자 당 싱글 사인온을 제공 할 수있었습니다. HttpContext를 현재이 될 것 global.asx 페이지가 작동하지 않습니다

+0

이 작업을 수행하는 방법을 알고 있지만 MembershipProvider를 사용하여 작업하는 방법을 알고 싶습니다. 제안 해 주셔서 감사합니다. – Sgraffite

2

에서 청소 코드의 무리 ...

Session.Abandon는()도 있었다. 당신이하려는 것처럼 각 사용자가 아닙니다. FormsAuthentication.SignOut()과 동일합니다.

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated) 
      { 
       //add your ckeck here 

       if (Usernames.Contains(User.Identity.Name)) 
        { 
         Session.Abandon(); 
         FormsAuthentication.SignOut(); 
        } 
      }  
    } 
+0

이름을 하드 코딩 할 때 사용자를 로그 아웃 할 수있게되었지만, 이것이 도움이 될 수는 없지만 이것이 이상한 곳이라고 생각합니다. 내가 로그 아웃하려는 사용자 이름을로드하는 방법이 필요합니다. 메소드가 호출 될 때마다 데이터베이스 호출을 의미합니다. – Sgraffite

+0

나는 그 사람이 당신을 강제로 로깅하기 전에 다시 웹 사이트에 올 때까지 기다리고 있기 때문에 그것이 나에게 거꾸로 느낀다고 생각한다. 쿠키가 무효가되도록 세션 서버 측을 무효화하는 방법이 있어야합니다. – Sgraffite

+0

모든 요청은 HttpContext를 통해 실행되며 처리되는 모듈 중 하나는 "SessionModule"입니다. 이 시점에서이 요청자 세션 만 읽을 수 있습니다. "얼마나 많은 열린 세션 수"를 계산하더라도 사용자 지정 논리가 필요하고 세션 이벤트를 관찰 할 수 있습니다. – turtlepick

관련 문제