2009-10-21 3 views
2

ASP.NET MVC에서 멤버쉽을 얻으려고 노력했습니다. 인증이 필요한 페이지가 있습니다. 손님 및 승인 된 회원을 보유 할 수있는 기타 StackOverflow와 매우 비슷합니다. 그들은 익명으로 또는 등록 된 사용자로서 일을 할 수 있습니다.ASP.NET MVC에 대한 자동 로그인 구현

우리는 또한 기본 ASP.NET 멤버쉽 방식이 아닌 멤버를 처리하는 사용자 지정 데이터베이스 스키마를 가지고 있습니다. 그래서 내 자신의 멤버쉽/교장 코드를 작성하려고합니다. 지금까지 잘 작동합니다. BUT 세션이 만료되고 '내 계정 정보 기억'기능을 구현하는 데 문제가 있습니다.

양식 쿠키를 설정하기 위해 FormsAuthentication.SetAuthCookie (username, rememberMe)를 사용하지만 사용자가 20 분 동안 컴퓨터를 나가거나 IIS에서 세션이 죽어서 재활용되고 매우 일관성없는 사용자 상태가 발생한다고 말합니다.

'내 계정 정보 기억'쿠키는 어디에서 가져 오며 다시 로그인하는 사용자를 어떻게 처리합니까? 기본적으로 사용자 이름과 비밀번호를 저장 한 다음 Application_BeginRequest 또는 그 밖의 쿠키에서 쿠키를 찾습니다.

답변

4

내가 올바르게 읽으면 ASP.NET이 영구적 인 인증 쿠키를 검색하고 해당 사용자의 마지막 세션 상태를 다시 설정할 것으로 예상하는 것처럼 보입니다. 인증 쿠키와 asp.net 세션은 두 가지 독립적 인 작업이므로 실제로 사용자가 사이트로 돌아가서 영구적 인 AuthCookie를 통해 인증을 통과하지만 새로운 (빈) 세션 데이터

AuthCookie가 올바르게 설정되었다고 가정하면 IIS 재활용 또는 세션 만료에 영향을받지 않는 User.Identity.IsAuthenticated으로 사용자가 인증되었음을 감지 할 수 있습니다. 사용자 이름은 User.Identity.Name에 노출되어 있습니다.

데이터를 다시 초기화해야하는 경우 사용자가 사이트로 돌아올 때 수동으로해야합니다. 이것이 실제로 묻는 것이라면 앱에 대해 잘 모른 채 대답하는 것이 어렵지만 global.asax에서 Session_StartSession_End 이벤트를 고려하십시오. 이 (세션이 만료 않는 후) 비어 때마다 또는 당신은 단지 세션 개체를 다시 채울를 null로 확인하실 수 있습니다, 예를 들면 :

//get some user info from session or db if session is null 
string preferredName; 
if (User.Identity.IsAuthenticated) 
{ 
    object o = Session["preferredName"]; 
    if (o == null) 
    { 
     preferredName = repository.GetUser(User.Identity.Name).PreferredName; 
     Session["preferredName"] = preferredName; //save to session so this isn't necessary next time 
    } 
    else 
    { 
     preferredName = (string)o; 
    } 
} 
else 
{ 
    preferredName = "anon"; 
} 
+2

단지 session_end-와 cavets의 인식 세션 상태가 때 작동하지 않습니다 수 SQL 서버에 저장 예 : – RichardOD

+0

좋은 지적! 나는 전체 공개의 목적으로 그것을 포함 시켰지 만, 나는 session_end에서 많은 것을하거나 아무것도하지 않을 것입니다. –

관련 문제