2010-03-08 6 views
2

기본 ASP.Net 폼 인증을 사용하는 웹 사이트가 있습니다. web.config 파일에서 개별 페이지 및 디렉토리에 대한 특정 액세스 규칙을 지정합니다. 모든 것이 훌륭하게 작동합니다.Forms 인증 리디렉션 전에 페이지 이벤트를 처리하는 방법은 무엇입니까?

그러나 지금은 새로운 요구 사항이 있습니다. 내 도메인에는 여러 하위 도메인간에 여러 가지 사이트 설정이 포함되어 있습니다. 이 응용 프로그램에 매핑되는 두 개의 DNS 하위 도메인이 있습니다. 하나는 aaa.mysite.com이고 다른 하나는 www.mysite.com입니다. FormsAuthentication 논리가 처리되기 전에 (사용자가 로그인 페이지로 리다이렉트 될 때까지) 특정 웹 요청이 FormsAuthentication에 의해 보호 된 페이지에 대한 하위 도메인 aaa.mysite.com으로부터 수신되면, 먼저 일부 코드를 실행하려고합니다. 이 코드는 기본적으로 세 번째 하위 도메인 인 zzz.mysite.com에서 쿠키를 읽으려고 시도하고 존재하지 않는 경우 zzz.mysite.com 응용 프로그램의 로그인 페이지로 Response.Redirect합니다.

내 Forms 인증 보호 페이지에서 상속받을 수있는 기본 클래스를 통해 처리 한 다음 Page_PreInit 함수에서 특수 코드를 호출하려고했습니다. 그러나 FormsAuthentication은 PreInit 함수가 호출되기 전에도 로그인 페이지로 리디렉션을 처리합니다.

누구든지이 케이스를 처리하는 좋은 방법을 알고 있습니까? Page_PreInit이 작동하지 않으면 FormsAuthentication 리디렉션보다 먼저 실행되도록 코드를 넣을 수 있습니다.하지만 어느 페이지에 액세스 할 수 있는지 (그리고 어떤 클래스가 상속되는지) 상속 여부를 확인할 수 있습니다. System.Web.UI.Page 또는 내 특수 BasePage에서 상속 된 경우).

아이디어가 있으십니까? 난 전역을 Application_BeginRequest, 사용할 수 있지만 다음 아주 좋은 생각처럼 보이지 않는 모든 단일 요청에 대해 호출 될 것이라고 생각합니다.

FormsAuthentication 이전에 이벤트를 처리하는 방법을 필요로하는 사람이 처음이 될 수는 없으므로, 저에게 감사드립니다.

감사합니다.

답변

1

쿠키가 zzz.example.com에 기록 된 경우 www.example.com에있는 사이트에서 쿠키를 읽을 수 없습니다. 하위 도메인간에 쿠키를 공유하는 방법은 .example.com에 기록하는 것입니다.

은 Web.config의에서 forms elementdomain 속성을 사용하여 폼 인증에서 구성 할 수 있습니다

<forms [...] 
    domain=".example.com"> 

주 도메인 이름의 선두 기간.

편집 당신은 아마 PostAuthenticateRequest event에 접선해야

언급을 응답하는 -이 사용자의 신원 후 해고 (또는 부족)을 설립하고,이 이벤트를 수신 할 수 custom HttpModule을 등록 할 수 있습니다.

웹 응용 프로그램 프로젝트는 다음 디렉토리 구조로 : 그래서,

/Default.aspx     -- Simple aspx page. 
/Login.aspx      -- Simple aspx page, with a Login control. 
/web.config      -- Main application config. 
/Classes/CheckingAuthenticate.cs -- HttpModule, configured in root. 
/Restricted/Default.aspx   -- Simple asp page. 
/Restricted/web.config   -- Config file for authorization 

편집 동작을

좋아 보여, 난 그냥 다음 설치를 테스트 한 루트 web.config는 표준 ASP.NET 멤버 자격 공급자를 사용하여 폼 인증을 설정하고 /Login.aspx을 로그인 페이지로 설정합니다. 나는 또한 거기에서 사용자 지정 HttpModule을 등록했다 :

<httpModules> 
    <add name="CheckingAuthenticate" 
     type="TempWebApp.Classes.CheckingAuthenticate"/> 
    [...] 
</httpModules> 

/Restricted/의 Web.config의 익명 사용자에 대한 액세스 (이 동일 루트에 <location> 요소에서 수행 될 수있다) 부인 :

<configuration> 
    <system.web> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 
    </system.web> 
</configuration> 

을 다음 http 모듈에 다음 코드가 있습니다.

using System; 
using System.Web; 
using System.Web.Security; 

namespace TempWebApp.Classes { 
    public class CheckingAuthenticate : IHttpModule { 

    public void Dispose() { 
     //clean-up code here. 
    } 

    public void Init(HttpApplication context) { 
     context.PostAuthenticateRequest += OnPostAuthenticate; 
    } 

    public void OnPostAuthenticate(object sender, EventArgs e) { 
     var app = sender as HttpApplication; 

     if (!UrlAuthorizationModule.CheckUrlAccessForPrincipal(app.Request.Path, 
                  app.User, 
                  "GET")){ 
     //Code here to read cookies, redirect user etc. 
     } 
    } 
    } 
} 

사용자가 인증되었지만 ASP.NET 시도 전에 발생합니다. 사용자에게 권한을 부여하여 액세스 권한을 직접 확인하고 대신 리디렉션 할 수 있습니다. 나는 아주 행복하게 그것에 브레이크 포인트를 칠 수 있었다. 사용자가 해당 페이지에 액세스 할 수없는 경우 AuthorizeRequest 또는 PostAuthorizeRequest 이벤트를 보지 못했습니다.

+0

예, 쿠키가 .example.com에 기록되어 모든 하위 도메인에서 쿠키에 액세스 할 수 있습니다. 쿠키가 아직 존재하지 않는다면 문제가 남아 있습니다. Forms Authentication 리디렉션을 수행하기 전에 어떻게 Response.Redirect 할 수 있습니까? – kazzamalla

+0

이 이벤트에 대한 내 Global.asax.cs 파일에 코드를 작성할 수는 있지만 사용자가 인증 된 후 시작되지는 않습니까? 사용자가 로그인 페이지에 인증 양식으로 리디렉션되기 전에 리디렉션을 수행하고 로그인을 요청했습니다. 그러나 행크에 대한 제 코멘트에서와 같이 사용자가 액세스하려는 페이지가 먼저 폼 인증에 의해 보호되는지 여부를 테스트하는 방법이 필요합니다. 어떤 아이디어? – kazzamalla

1

AuthenticateRequest 이벤트를 사용해야한다고 생각합니다. lifecycle을 참조하십시오. 모든 요청에 ​​대해 걱정하지 마세요, 많은 것들이 그것을합니다.

+0

이 메서드를 사용한 경우 액세스중인 현재 페이지에 web.config의 규칙을 기반으로 폼 인증이 필요한지 확인하기 위해 어떤 메서드를 호출해야합니까? – kazzamalla

+0

UrlAuthorizationModule.CheckUrlAccessForPrincipal을 찾았지만이 메서드는 유효한 IPrincipal 개체를 필요로하며 수명주기 HttpContext.Current.User의이 시점에서 null입니다. 알아 내기 전에 리디렉션하고 싶기 때문에이 시점에서는 사용자를 알지 못합니다. 어떤 아이디어? – kazzamalla

+0

링크 된 페이지를 확인하십시오. 다음 이벤트는 PostAuthenticateRequest입니다. 아마도 AuthorizeRequest도 사용할 수 있습니다. –

관련 문제