2011-12-04 2 views
1

다음과 같은 문제가 있습니다. ASP.NET 웹 앱을 다시 게시하면 세션이 재설정되어 NullReferenceException이 발생할 수 있습니다. FormsAuthentication.RedirectToLoginPage()가 수행하지 않습니다.

내 페이지를 확인,이 정보의 존재를 것을 방지하고 널 (null)의 경우 로그인 페이지 (양식 인증)로 사용자를 리디렉션, 그래서 전화 했어하려면

void LogOut() 
{ 
    Session.Clear(); 
    Session.Abandon(); 
    User = null; 
    FormsAuthentication.SignOut(); 
    FormsAuthentication.RedirectToLoginPage() 
} 

를하지만 가끔은 도움이되지 않습니다 , 그래서 해결 방법을 찾을 :

Response.Redirect(FormsAuthentication.LoginUrl); 

를하지만 나는 그것이 (내가 수동으로이 동작을 모방하지 않으려는) 있었으면 무엇 returnUrl를 추가하지 않습니다.

첫 번째 방법이 예상대로 작동하지 않는 이유를 파악하고 싶습니다.

답변

5

FormsAuthentication.RedirectToLoginPage() 이후에 Response.End()으로 전화를 걸어 보았습니까?

1

다음과 같은 문제가 있습니다. ASP.NET 웹 응용 프로그램을 다시 게시하면 예상되는대로 세션이 재설정되어 어디에서 추가 사용자 정보를 유지할 수 있습니까 (액세스 시도시 NullReferenceException이 발생합니다).

그러나 때로는

난 당신이 "때로는 도움이되지 않는다"무슨 뜻인지 모르겠어요 도움이되지 않습니다 - 당신이 정확히 무슨 말을하지 않습니다.

그러나 Forms 인증 티켓의 만료 및 세션 시간 초과의 만료는 완전히 독립적이라는 것을 기억해야합니다. 사용자의 세션은 양식 인증 티켓이 유효하고 그 반대의 경우에도 시간 초과 될 수 있습니다.

일반적으로

, 세션에서 데이터를 액세스 할 때, 당신은 항상 먼저 존재 여부를 테스트해야하며, 필요한 경우 새로 고침 :

object o = Session["Whatever"]; 
if (o == null) 
{ 
    o = ... refresh it e.g. from the database 
    Session["Whatever"] = o; 
} 
... 

는 종종이를 캡슐화하는 도우미 클래스를 사용하는 것이 유용합니다.

"추가 사용자 정보"를 참조하십시오. 따라서 HttpContext.Current.User.Identity.Name을 키로 검색 할 수 있습니다.

세션이 만료되어 사용자가 다시 로그인하도록합니다. 서버에서 응용 프로그램 풀 재활용 때문에 매우 비우호적입니다.

UPDATE

것을 RedirectToLoginPage 상태의 MSDN 문서 다음 HttpResponse.Redirect 방법과는 달리,이 방법은 HttpResponse.End를 호출하여 요청을 종료하지 않습니다

. 즉, RedirectToLoginPage 메서드 호출을 따르는 코드가 실행됩니다. RedirectToLoginPage에 전화 후 페이지 수명주기에서 코드를 실행하고, NullReferenceException을 던지는 :

이것은 아마 당신이보고있는 것을 설명합니다.

RedirectToLoginPage 다음에 Response.End으로 전화하여이를 피할 수 있습니다.

내 세션 시간 초과 설정 = 양식 인증 시간 초과 (web.config를 통해).

타임 아웃이 동일해도 세션 만료 및 FormsAuthentication 만료는 다시 관련이 없습니다. FormsAuthentication 쿠키는 서버에서 응용 프로그램 풀 재활용 후에도 유지됩니다. 세션은하지 않습니다.

+0

감사합니다. 무슨 일이 일어나고 (그리고 무엇이 아닌지) :'RedirectToLoginPage()'는 아무 일도하지 않습니다 - 코드가 먼저 실행되고 NullReferenceException이 발생합니다. 현재 사용자 (일부 연결된 객체, 예 : ClientCompanyName)에 대해 더 많은 정보를 유지하기 때문에 – abatishchev

+0

내 세션 시간 초과 설정 = 양식 인증 시간 초과 (web.config를 통해). 사용자가 자동으로 양식 승인을 통해 로그인 페이지로 리디렉션되며 예상대로 작동합니다. 하지만 내 시나리오는 더 많은 개발/배포 프로세스 관련 : 새 버전을 게시 한 후, 나는 로그인 페이지로 리디렉션되고 싶지 않으며 NullReferenceException을 얻지 않습니다. – abatishchev

관련 문제