2010-01-18 40 views
7

我正在一個網站(用C#開發的ASP.NET)上工作,這個網站已經傳遞給我了。當我通過該網站的工作,我發現很多網站都有這種類型的代碼在它:隱藏控件作爲網絡安全形式,建議更好?

EmailLabel.Visible = false; 
WhateverButton.Visible = false; 
AnotherControl.Visible = false; 
... 

這一切通常在網站的後臺代碼完成(在Page_Load方法)。本質上,這是爲了防止未登錄的用戶訪問組件(該網站的規則是,未登錄的用戶在登錄前應該無法看到網站的任何部分)。 以上的方式工作 ...但必須始終檢查用戶是否已登錄,然後轉到所有這些組件的正確狀態,這似乎相當昂貴。

是否有不同的方式,這個問題可能會接近。僅僅從思考/研究的角度來看,我想也許有一種方法可以在用戶未登錄的情況下重定向回主頁。甚至進一步,我可以擴展一個基本頁面,以便爲任何用戶頁面擴展了基本頁面。但是,我在這方面的知識是有限的,所以我的建議可能無效。

什麼能如此建議?有什麼更好的?有什麼好的嗎?

回答

2

我們在工作中做了很多工作。

我們完成此任務的方式是創建一個從System.Web.UI.Page繼承的BasePage類。然後你重寫OnInit,調用base.OnInit,並添加代碼來檢查登錄用戶。如果用戶未登錄,請將其重定向到登錄頁面(不會從BasePage繼承)。

然後,在需要保護的每個頁面上,只需將頁面更改爲從BasePage繼承。

與上面說的womp相反,如果你寫了Response.End();重定向後,即使繼續處理頁面的其餘部分,速度也會更快!

希望有所幫助。

+0

儘管這種方法在大多數情況下都是絕對推薦的,但它不可能更快。如何設置一些布爾變量在接近發送301往返瀏覽器的開銷的任何地方?你正在談論納秒的處理器時間與數百毫秒的網絡延遲以及處理多個瀏覽器請求的服務器。並且Response.End()拋出一個ThreadAbortException異常,這會產生它自己的開銷。 – womp 2010-01-18 17:57:13

+0

只是爲了澄清 - 保護需要*唯一*認證訪問的頁面絕對應該以這種方式完成。我不清楚OP是否需要這個或不。 – womp 2010-01-18 17:58:49

+1

之所以這樣更快,是因爲OnInit之後的頁面循環方法都沒有以這種方式調用。節省大量的CPU時間。對於所有意圖和目的,如果用戶未登錄,則預期會有額外的往返時間和與其相關的時間。 – TJMonk15 2010-01-18 18:34:09

1

這將是幅度發出重定向,而不是將可見的標誌上的一些控制更貴的多,很多訂單。

如果您的頁面允許匿名訪問和登錄訪問,那麼重定向也會要求您以其他方式允許匿名訪問,可能是通過構建第二個版本的頁面。

費用問題實際上只是一個旁觀,它可能根本無關緊要。要回答你的主要問題,不知道更多關於你的應用程序的架構,我會認爲這兩件事情都是不可取的。將控件設置爲Visible = false的優點是沒有任何東西會呈現給不可見控件的輸出流,但它們仍然可以與服務器請求進行交互。

不知道更多關於你的頁面的要求,很難提出其他建議。正如其他人所提到的,如果隱形控件根本不參與匿名用戶,那麼LoginView可能會滿足您的需求。

+0

好的答案(+1),但我很好奇爲什麼重定向是「更貴的幾個數量級」。特別是因爲,無論如何,一個未登錄的用戶幾乎不可能「爆發」主頁(除非他們記住地址到隨機頁面)。所以,這不應該是經常發生的事情。 – JasCav 2010-01-18 17:46:50

+0

考慮設置一些可見標誌需要幾個處理器週期,而生成重定向需要往返瀏覽器,所有網絡延遲,服務器資源處理新請求以及完成頁面生命週期的處理。 – womp 2010-01-18 17:53:21