2008-11-21 101 views
5

我正在使用我自己的IIS自定義身份驗證,並且我希望服務器每頁面加載(無論是哪種類型的文件)首先檢查應用程序變量以查看用戶是否已驗證並授權查看該站點。在global.asax這可能是:使用global.asax有什麼替代方法?

void Application_Start(Object Sender, EventArgs e) 
{ 
    if(Application["username"] == null) 
    { 
    Response.redirect("login.aspx"); 
    } 
} 

問題是,該網站有多個子根。也就是說,http://example.com/site1是與http://example.com/site2完全不同的網站。因此,我想說Application_Start函數在site1上工作,但不會影響site2。

如果global.asax在目錄級別是可定製的,那麼這不會是一個問題。但由於每服務器只有一個global.asax服務器我無法實現此解決方案。

global.asax還有什麼替代方法?或者global.asax可以以不同的方式爲每個目錄?

回答

9

的HttpModules是一種替代的Global.asax

(也參見https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm
http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx

的HttpModules被登記在web.config中;其中,方便地,可在目錄級定製。所以每個目錄都可以有自己獨特的一組模塊(在較低的目錄中繼承)。所有模塊與global.asax中的模塊具有相同的功能。

基本上,每個頁面請求在它到達實際頁面代碼本身之前都會通過每個註冊模塊。出現這種情況,無論它是什麼樣的要求:

 
"page.aspx" "page.html" 
    |    | 
( | module 1 | ) 
( | module 2 | ) 
( | module 3 | ) 
    V    V 
(handler 1) (handler 2) 

((更好的圖片和描述可以在https://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm中發現))

所以,那麼所有你需要做的就是定義你的代碼作爲模塊,而不是在global.asax中。如果用戶未通過身份驗證,則:response.redirect("login.aspx")將停止控制權到達處理程序並解析/返回/運行所請求的頁面。

這比這更復雜一點,所以更好的描述/教程可以在codeguru網站找到。

1

我敢肯定,一旦有人登錄,您的代碼將允許訪問所有人 - 可能不是您想要的。

根據http://msdn.microsoft.com/en-us/library/ms178473.aspx

「被叫當請求在ASP.NET應用程序的第一資源(例如,頁)的Application_Start方法是調用一次的生命週期期間。應用程序「

此外根據http://support.microsoft.com/kb/307598#1 」應用程序狀態變量實際上是每個ASP.NET應用程序的全局變量。「

我建議您使用內置的Membership API並使用web.config文件限制訪問。

如果您打算使用Membership API而不是滾動自己的身份驗證機制,則可以使用web.config檢查用戶是否被授權訪問特定文件夾。您還可以相對簡單地讓用戶登錄到一個站點,並通過共享身份驗證票據自動登錄到其他站點,前提是它們都位於同一個根域中。

共享身份驗證票證看到: http://msdn.microsoft.com/en-us/library/ms998288.aspxhttp://www.netomatix.com/development/singlesignon.aspx

關於如何使用web.config中限制訪問: http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=85

0

其實我相信有每asp.net應用程序只是一個Global.asax中。如果您希望example.com/subsite1成爲與example.com/subsite2不同的應用程序,則可以在IIS中創建兩個不同的應用程序。因此,它們將運行在完全不同的應用程序域中(儘管它們可能處於相同的進程中(aspnet_wp.exe或w3wp.exe),甚至共享應用程序池)。因此,如果他們是不同的應用程序,他們也應該擁有獨立的global.asax文件。

將目錄轉變爲應用程序。打開IIS->找到目錄/子站點,右鍵 - >屬性 - >主目錄選項卡 - >點擊「創建」。

有關應用程序域和工作進程的更多信息,請考慮reading this blog entry。希望有所幫助。

相關問題