2011-05-05 6 views
1
var query = from p in AdminModelContext.Users 
      where p.UserName == model.UserName && p.Password == encryptPassword 
      && p.IsDeleted == false 
           select p; 
      IList<Users> userList = query.ToList(); 

if (userList.Count() > 0) 
{ 
    FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

    if (CheckUrl(returnUrl)) 
    { 
     return Redirect(returnUrl); 
    } 

    SetRoleForUser(userList[0].RolesId); 
    LoggerService.Info(string.Format("Login Successful for the user : {0}", 
     model.UserName)); 

    return RedirectToAction("Index", "Home"); 
} 

내 웹 사이트를 통해 로그인하려면 다음 코드를 사용하고 있습니다. 내가 직면하고있는 문제는 특정 브라우저에서 사용자와 로그인하고 다른 브라우저에서 다른 사용자와 동시에 로그인 한 다음 다른 브라우저에서 로그인 한 사용자를 삭제할 때 발생합니다. 여전히 삭제 된 사용자가 로그인 한 페이지를 탐색 할 수 있습니다.삭제 된 사용자가 다른 브로슈어에서 삭제 한 후에도 로그인했습니다.

모든 페이지에 인증 논리를 적용하는 데 필요한 적절한 솔루션을 찾을 수 없습니다. 내 웹 사이트는 MVC 모델이며 양식 기반 인증을 사용합니다.

로그인 한 사용자 세션 유효성 검사를 어떻게 수행하고이를 수행 할 수 있는지 제안하십시오.

+0

, 문제는 여전히 사용자의 컴퓨터에 유효한 인증 티켓, 그래서이 코드가 실행되지 않습니다. Global.asax, Session_Start 이벤트에서 사용자가 삭제 한 상태인지 확인하는 것이 좋습니다. – hazimdikenli

+0

사용이 삭제되면 FormsAuthentication.SignOut (또는 그와 비슷한 Session.Abandon)을 수행하십시오. – hazimdikenli

+0

글쎄, 당신의 문제가 그렇게 간단하지 않은 것처럼 보입니다. – hazimdikenli

답변

0

일반적으로 제어기 또는 동작에 대해 [Authorize] 속성이 정의되어있는 경우 모든 게시물에 대해 인증이 확인됩니다.

MembershipProvider의 빌드가 모든 것을 처리합니다. 하지만 그것은 당신이 자신의 사용자 데이터베이스를 사용하는 것 같습니다. 그런 다음 자신 만의 MembershipProvider, IPrincipalMembershipUser을 구현하고 Web.config에 추가하여 기본값을 바꾸십시오.

당신이 당신의 자신의는 MembershipProvider 구현하는 방법을 여기에서 찾을 수 있습니다 더 많은 : http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

나의 제안은 빈 MVC 프로젝트를 생성하고 기본 인증 메커니즘을 살펴 가지고하는 것입니다. 새 데이터베이스로 새 응용 프로그램을 빌드하는 경우 기본 인증을 사용해보십시오.

MembershipProvider의 validateUser 함수는 다음과 같을 수 있습니다.

public override bool ValidateUser(string username, string password) 
{ 
    bool isValid = false; 
    bool isApproved = false; 
    string pwd = ""; 

    using (AdminModelContext db = new AdminModelContext()) 
    { 
     var user = db.Users.FirstOrDefault(u => u.UserName == username); 
     if (user != null) 
     { 
      pwd = user.Password; 
      isApproved = user.IsApproved; 

      if (CheckPassword(password, pwd)) 
      { 
       if (isApproved) 
       { 
        isValid = true; 

        user.LastLoginDate = DateTime.Now; 
        user.LastActivityDate = DateTime.Now; 

        try 
        { 
         db.SubmitChanges(); 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex); 
        } 
       } 
      } 
      else 
      { 
       UpdateFailureCount(username, "password"); 
      } 
     } 
    } 

    return isValid; 
} 
+0

초기 반응은 @Sergi Papseit의 대답과 같은 이유로 DV입니다. 그러나 회원 제공 업체가 내 답변에서 말한 것과 비슷한 것을하지 않는다고 절대 확신하지는 않습니다. 나는 그들을 사용하지 않는다. 그것들을 제거하면 항상 프로젝트를 만드는 데있어 나의 첫 비즈니스 순서가된다. –

+0

나는 그 user.Password가 거기에 1 가지 방법으로 해쉬 된 값인 것을 확실히 희망한다. 과거에, 모든 요청에 ​​대해이 문제가 발생하면 중간 수준의 동시 사용에 대해 데이터베이스를 무너 뜨릴 수 있다고 생각했습니다. –

+0

MembershipProvider와 AuthorizeAttribute가 완벽하게 작동합니다. AuthorizeAttribute로 컨트롤러에 플래그를 지정하면 모든 작업은 권한이 부여 된 사용자 만 액세스 할 수 있습니다. MembershipProvider.ValidateUser()는 Mvc가 권한 부여가 필요한 컨트롤러 또는 액션을 감지하면 호출됩니다. 이 사용자가 더 이상 존재하지 않으면 false를 반환합니다. – DanielB

1

지금까지 답변을 얻지 못했습니다. 티켓은 자격 증명에 독립적이기 때문에이 시점 아무것도에서

User A enters log in page, supplies valid credentials 
User A is issued Ticket A. 

User B enters site, supplies valid credentials. 
User B is issued Ticket B. 

User B then revokes User A's access CREDENTIALS. 

이 티켓 A.에 발생합니다

는 제어 흐름에서 볼 수 있습니다. 티켓 A가 만료되면 자격 증명을 제시해야하며 로그인에 실패합니다.

그래서 실제 사용자를 사이트 밖으로 내쫓는 것이 실제로 꽤 어렵다는 것을 눈치 챘습니다. 유일한 해결책은 모든 요청에 ​​인증 논리를 갖는 것입니다. 불행하게도 그것은 정말로 무겁다.

내가 만든 로그인 시스템에서는 2 개의 티켓, 큰 기간이있는 Forms Auth 티켓에 저장된 1 개의 티켓 및 HttpRuntime.Cache에 저장된 티켓을 처리하여 캐시 만료를 다음과 같이 설정했습니다. 이 티켓으로 15 분.

모든 페이지 요청시 사용자가 티켓을 가지고 있지 않은지 (양식 인증 정보를 기반으로) 캐시에 티켓이 있는지 확인합니다. 사용자 데이터를 새로 고치고 사용자 데이터베이스를 폴링합니다. . 사용자가 일시 중지되거나 삭제되면 해당 사용자는 로그 아웃됩니다.

이 방법을 사용하면 내 사이트에서 사용자를 사용 중지 할 수 있음을 알고 15 분 이내에 사용자가 사이트에서 차단됩니다. 만약 내가 그들을 즉시 차단하기를 원한다면 나는 캐시를 지우고 그것을 강제하기 위해 앱 설정을 순환시킬 수있다.

+0

그것은 질문이 말하는 것이 아닙니다. 문제는 동일한 사용자가 다른 세션을 열어도 세션 중 하나를 로그 아웃하더라도 남은 세션은 로그인해야하는 페이지를 계속 탐색 할 수 있지만 동일한 사용자 인 경우 다른 세션에서도 로그 아웃되었습니다. –

+1

질문을 통해 5 번 읽었으며 매회 "다른 사용자"의 단어 "* different *"를 놓칠 수있었습니다 = ( –

+1

2 개 티켓 시스템을 사용하는지 여부에 상관없이, 의도가 사용자가 삭제 된 후에도 사용자가 항목에 액세스 할 수 없도록하려면 양식 인증에서 사용자가 인증되었다고 주장하더라도 콘텐츠를 볼 수있는 권한이 없다는 사실을 인식 할 수있는 적절한 인증 코드가 필요합니다. 허위/구식 인증이 보여야하는 모든 문제 처리 – KallDrexx

0

지금 문제가 있습니다.MVC에서 어떻게 작동하는지 알지 못하지만 Authenticate_Request를 사용하면 사용자가 유효한지 유효성을 검사 할 수 있습니다. 비즈니스 논리는 사용자가 아직 유효한지 다시 확인합니다. 그러나 내가 아는 한, 열려있는 모든 세션을 반복하고 더 이상 필요하지 않은 세션을 죽이는 방법은 없습니다.이 경우에도 권한 쿠키는 Session_Start 이벤트에서 두 번 검사해야합니다. 또 다른 옵션은 응용 프로그램에 전역 invalidated_users 목록을 추가 한 다음 해당 사용자를 잘못된 목록과 대조하는 것입니다. 이 목록에는 응용 프로그램을 다시 시작한 후에 무효화 된 사용자 만 포함되어야합니다. 세션의 모든 사용자를 읽기위한

링크 : 위의 코드가 맞다

http://weblogs.asp.net/imranbaloch/archive/2010/04/05/reading-all-users-session.aspx

관련 문제