2010-03-08 51 views
2

我有一個網站使用基本的ASP.Net表單身份驗證。在web.config文件中,我們爲單個頁面和目錄指定了特定的訪問規則。一切都很好。如何在表單身份驗證重定向之前處理頁面事件?

不過,現在我有一些新的要求。我的網域包含不同子網域之間的許多不同網站。我有兩個映射到此應用程序的DNS子域。一個是aaa.mysite.com,另一個是www.mysite.com。如果一個特定的Web請求從子域aaa.mysite.com收到由FormsAuthentication保護時,FormsAuthentication邏輯處理前一個頁面(用戶將被重新定向到登錄頁面),我想先執行一些代碼。這段代碼基本上會嘗試從第三個子域中讀取cookie,如zzz.mysite.com,如果不存在,則將Response.Redirect發送到zzz.mysite.com應用程序中的登錄頁面。

我試圖通過一個基類,我的任何窗體身份驗證保護的網頁可以繼承,然後調用在Page_PreInit功能的特殊代碼處理此。但是,即使在調用PreInit函數之前,FormsAuthentication也會處理重定向到Login頁面。

有誰知道來處理這種情況的好辦法?如果Page_PreInit不起作用,我可以在哪裏放置代碼,以便它在FormsAuthentication重定向之前執行,但是在哪裏我也可以訪問它是哪個頁面(以及它從哪個類繼承,因此我可以看到它是否繼承自System.Web.UI.Page或從我的特殊BasePage繼承)。

任何想法?我認爲我可以使用Globals Application_BeginRequest,但是這會針對每一個請求調用,這似乎不是一個好主意。

我不能成爲誰也需要一種方法來之前FormsAuthentication處理事件的第一人,所以請你能給我一些額外的想法,我將非常感激!

謝謝!

回答

1

如果cookie已被寫入zzz.example.com然後www.example.com網站無法閱讀 - 跨子域共享餅乾的方法是把它們寫.example.com

這可以在窗體身份驗證使用的forms elementdomain屬性在web.config配置:

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

注意在域名超前時段。

編輯迴應置評

你或許應該被鉤住PostAuthenticateRequest event - 這是後用戶的身份解僱(或缺乏)成立,你可以註冊一個custom HttpModule收到此事件。

編輯展現運作

好吧,我剛剛測試了以下設置:

Web應用程序項目,具有以下目錄結構:

/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成員資格提供程序設置Forms身份驗證,並將/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

是的,這是真實的,cookie寫入.example.com,以便所有子域都可以訪問它。問題仍然存在,如果cookie尚不存在,我怎麼能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。 –

相關問題