2010-03-29 3 views
3

인증이 필요한 모든 페이지에 대해 System.Web.UI.Page를 확장하는 중개 클래스가 있습니다. 클래스는 주로 사용자 정의 인증 처리를 수행합니다.예외를 throw하지 않고 Response.Redirect()를 수행하는 것이 안전 할 때는 언제입니까?

액세스가 불충분 한 사용자가 페이지 방문을 시도 할 때 더 이상의 페이지 이벤트 (예 : Page_load)가 실행되는 것을 방지하면서 사용자를 로그인 페이지로 리디렉션하려고합니다. 마음에 떠오른 첫 번째 해결책은 Response.Redirect의 기본 구현이었습니다. 물론 이것에 대한 단점은 ThreadAbortExceptions이 발생할 가능성입니다.

그럼 내 질문은 다음과 같습니다. 페이지 라이프 사이클 동안 (실제로) ThreadAbortException이 발생하지 않고 Response.Redirect()를 실행하는 것이 실제로 안전 할 때?

public class CustomPage : System.Web.UI.Page 
{ 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     if (!IsValid()) 
      Response.Redirect("login.aspx", true); 
    } 
} 
+0

왜 ThreadAbortException을 발생시키지 않겠습니까? 요청 된 페이지의 더 이상의 처리를 중지하기 위해 throw됩니다. –

+0

나는 그것이 사실이라고 생각한다. 그러나 VS에서 자동 예외 중단을 설정하면 Response.Redirect()가 항상 예외를 throw하지는 않지만 여전히 페이지의 나머지 부분은 건너 뜁니다. – ddechant

답변

4

두 번째로 true를 전달하면 절대 안전하지 않습니다 매개 변수 - 항상 예외를 throw합니다. 내부적으로 Response.Redirect()은 현재 스레드를 직접 중단하는 Response.End()을 호출합니다.

예외가 발생하지 않고 HttpRequest을 자르는 유일한 "안전"방법은 HttpApplication.CompleteRequest()을 사용하는 것이지만 현재 요청에서 추가로 코드가 실행됩니다.

+0

이 경우가 확실하지 않습니다. 그 이유는 내가 Response.End()가 예외를 던지기 전에 IsInCancellablePeriod를 검사하기 때문이라고 생각합니다. 그래서 어딘가에 Response.End()는 그 예외를 두드리지 않고 호출 될 수 있습니다. – ddechant

+0

더 깊이 파고 들어야합니다. IsInCancellablePeriod가 HttpApplication.IExecutionStep 인터페이스 개체의 플래그로 완전히 제어된다는 것을 알 수 있습니다. 이 플래그는'return! (this._application.Context.Handler는 IHttpAsyncHandler입니다.); CallHandler 구현 (ProcessRequest를 호출하는 것, 즉 페이지 수명주기를 호출하는 것)에 대해. 즉, 비동기 요청을 실행하지 않는 한 전체 페이지 라이프 사이클 동안 항상 false가됩니다. – womp

+0

그래서 Response.Redirect ("login.aspx")를 try/catch없이 호출하면 HttpApplication.Application_Error (그렇지 않은 경우)가 발생하지 않아야합니다. – ddechant

1

호기심, 왜 너 자신 이니? 무엇보다도 인증 공급자 중 하나를 사용해야합니다 (궁극적으로 FormsAuthentication은 사용자가 생각할 수있는 거의 모든 시나리오를 처리하도록 사용자 지정할 수 있음).

그런 다음 web.config 파일에서 authorization element을 사용하여 익명 사용자가 액세스 할 수없는 페이지/디렉토리를 나타낼 수 있습니다. ASP.NET은 사용자를 로그인 페이지로 리디렉션하고 사용자가 로그인하면 다시 리다이렉트합니다.

+0

그건 내가 생각했던 한 가지 옵션이었습니다. 나는 이것이 내가 생각해 낸 해결책 중 가장 쉽고 가장 쉽게 유지되었다고 생각했다. 인증이 필요한 모든 페이지는 단일 디렉토리에 보관됩니다. 페이지에 액세스하기위한 5 가지 이상의 역할과 디렉토리 (20+)의 각 페이지에는 서로 다른 역할 요구 사항이 있습니다. 인증이 필요한 각 페이지에 대해 web.config에서 위치 섹션을 수행하는 것을 보았습니다. 내 다른 옵션은 각 역할에 대해 별도의 디렉토리로 파일을 분할하는 것이 었습니다. 사용자가 여러 역할을 맡았을 때 경로 유지 관리 문제가있었습니다. – ddechant

0

ThreadAbort 예외를 원하지 않으면 endResponse 매개 변수에 False를 전달해야합니다. 물론 이것은 페이지의 나머지 부분을 처리해야한다는 것을 의미합니다.

자물쇠를 들고있는 것처럼 어리석은 일을하지 않는다면 ASP.NET 페이지에서 ThreadAbort 예외를 던져도 안전합니다.

또 다른 옵션은 Server.Transfer를 사용하는 것입니다. 리디렉션보다 성능이 좋지만 ThreadAbort 예외도 사용합니다.

관련 문제