2010-04-16 4 views
0

Can I access session state from an HTTPModule?에있는 솔루션 다음에 IHttpModule에서 세션 상태에 액세스 할 수 있습니다. 일부 파일에 대한 액세스를 제어하는 ​​데이 파일을 사용하고 있기 때문에 누군가 액세스 권한이없는 경우 로그인 페이지로 리디렉션하려고합니다. HttpContext.Current.Response.Redirect (페이지); 웹 서버를 잠급니다. 그래서 내 게시물 획득 요청 상태 함수는 다음과 같습니다 ...IHttpModule에서 세션에 액세스하여 response.redirect를 수행 할 수 있습니다.

void Application_PostAcquireRequestState(object source, EventArgs e) 
    {    
     HttpApplication app = (HttpApplication)source; 

     MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler; 

     if (resourceHttpHandler != null) 
     { 
      // set the original handler back 
      HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler; 
     } 

     HttpContext context = HttpContext.Current; 
     string filePath = context.Request.FilePath; 
     context.Trace.Write("HttpDownloadModule", "File path: " + filePath); 

     Boolean hasAccess = true; 

     if (filePath.Contains("content/downloads")) 
     { 
      //check to make sure a session has been established already.... 
      if (context.Session == null) 
       hasAccess = false; 

      SecurityBLL security = new SecurityBLL(); 
      string fileName = filePath.Split('/').Last(); 

      //check to see if a user is logged in 
      if (!CitrixAccess.loggedin) 
       hasAccess = false; 

      //check access for download 
      if (!security.checkSecurityByDownload(fileName)) 
       hasAccess = false; 

      if (!hasAccess) 
      { 
       HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler; 
       HttpContext.Current.Response.Redirect("../../login.aspx"); 
      } 
     } 

    } 

어떤 생각? 도와 주셔서 감사합니다!

답변

0

그래, 해결 방법을 찾았습니다 ... 내 hasAccess 변수를 전역 변수로 이동하고 EndRequest 핸들러를 추가했습니다. 그래서 EndRequest에서 hasAccess를 검사하고 거기에서 리다이렉션을 수행합니다.

0

내 답변에는 Arthurdent510's answer이 포함되어 있지만 그의 대답은 하하에 대해 간단히 설명 할만한 충분한 평판이 없습니다. 그의 대답은 내가 어디로 가야 하는지를 알아 내는데 많은 도움이되었지만, 그것은 나를 위해 완벽하지는 않았다.

EndRequest 처리기에 Response.Redirect 호출을 넣으면 무한 루프가 발생했습니다. Response.Redirect가 EndRequest가 호출되도록하기 때문에 이것이라고 생각합니다. 따라서 EndRequest는 계속해서 반복해서 호출되었습니다.

이 문제를 해결하기 위해 개인 리디렉션을 추가하여 이미 리디렉션을 요청했는지 여부를 나타냅니다. 이미 리디렉션을 요청한 경우 Response.Redirect를 다시 호출하지 않습니다. 이것이 내 EndRequest 메소드의 모습입니다.

Private Sub Application_EndRequest(ByVal source As Object, ByVal e As EventArgs) 
    If Not _blnHasAccess AndAlso Not _blnRedirected Then 
     _blnRedirected = True 
     HttpContext.Current.Response.Redirect("~/Error.aspx") 
    End If 
End Sub 
관련 문제