使用IHttpHandler做許可權控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName]

來源:互聯網
上載者:User

 

前言

     在對項目制定許可權控制方案的時候往往有幾種方案,比如讓所有的ASPX頁繼承一個自訂的PageBase頁,而這個頁再繼承System.Web.UI.Page;另外一種就是使用IHttpModule了。我們先來比較兩種方案以及適用性,第一種方案是比較理想也實際運用中比較多的,但是經常會碰到我們突然加入一個項目(可能比較糟糕的),他們一開始就沒有這方面的考慮,後來才考慮增加的,此時你發現頁面已經到了2百個甚至更多,讓每個頁面重新繼承至PageBase工作量比較大,改動比較多就不太方便了(仍然是比較推薦的);可能此時已經想到偷懶的辦法用IHttpModule,但是我不得不說效能實在堪憂,任何頁麵包括使用者控制項都會過來請求一次,打斷點調試你就會發現,如果頁面上有3個使用者控制項,那多IHttpModule訪問應該在4次或4次以上,再加上Ajax訪問,其他不要控制的頁面也被強制控制了,雖然預設也會訪問但是實在是不太理想!!早之前我就一直想用IHttpHandler來做許可權控制的,但是發現沒有Java裡面的過濾器好用,他不會繼續你的請求,需要你自己來指定下一步再怎麼做,到底是跳轉到其他頁呢還是直接返迴文件流呢由你來決定,一般用來做防盜鏈、頁面重新導向比較好。我比較喜歡IHttpHandler就是他能起到控制指定檔案夾內訪問截獲,這樣我們就可以對指定的檔案夾進行存取控制了,接下來我給大家分析下到底如何?以及遇到的問題,及其解決辦法。

 

感謝

     [分享]在自訂的HttpHandler中調用.net預設HttpHandler的方法

      沒有這篇文章的解決辦法就沒有我這篇文章了,再次感謝!!

 

本文

     Web.Config配置如下:

<add verb="POST,GET" path="/page/*.aspx,/page/*/*.aspx,/page/*/*/*.aspx,/page/*/*/*/*.aspx,/page/*/*/*/*/*.aspx" type="WebLibrary.PowerManage.HttpHanderPowerControls"/>

     整個IHttpHandler實現代碼如下:

    /// <summary>
    /// 本HttpHanderPowerControls可以控制許可權,但是在使用AjaxPro的時候AjaxPro.Utility.RegisterTypeForAjax需要指定第二個參數,否則會報錯
    ///     如:AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default),Page);
    /// </summary>
    public class HttpHanderPowerControls : IHttpHandler, IRequiresSessionState
    {

        /// <summary>
        ///  擷取一個值,該值指示其他請求是否可以使用 System.Web.IHttpHandler 執行個體。
        /// </summary>
        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            HttpSessionState session = context.Session;
            //許可權判斷
            if (session["uname"] != null && !string.IsNullOrEmpty(session["uname"].ToString()))
            {
                //Type type = BuildManager.GetCompiledType(path);
                //ASP.NET 1.1使用以下語句獲得IHttpHandler
                //context.Server.Transfer(PageParser.GetCompiledPageInstance(path, context.Request.PhysicalPath, context),true);
                //AjaxPro.Utility.RegisterTypeForAjax(type, handler as Page);
                context.Server.Transfer(BuildManager.CreateInstanceFromVirtualPath(context.Request.Path, typeof(Page)) as IHttpHandler, true);
            }
            else
            {
                context.Server.Transfer("/login.aspx");
            }
        }
    }

 

     代碼說明:

               1.     這裡我只截獲.aspx的檔案請求訪問,所以CreateInstanceFromVirtualPath第二個參數指定成typeof(Page)就行了,當然也可以用BuildManager.GetCompiledType(path)獲得它的Type,調試的時候我發現這行代碼比較費時間,而且也不需要就直接用了Page了

               2.     BuildManager.CreateInstanceFromVirtualPath 方法 MSDN說法:處理給定了虛擬路徑的檔案,並建立結果的執行個體。      [分享]在自訂的HttpHandler中調用.net預設HttpHandler的方法 提供的是我注釋掉的部分,是ASP.NET 1.1使用,當然2.0下也能使用!

     流程說明:

               使用者訪問根目錄下/page目錄下的aspx頁面,將被HttpHanderPowerControls截獲,在ProcessRequest裡進行許可權判斷,如果有許可權的話繼續執行頁面(手動建立編譯指定的頁面的執行個體);如果沒有許可權,跳轉到login頁面。

 

注意問題:

     1.     在使用AjaxPro的時候AjaxPro.Utility.RegisterTypeForAjax需要指定第二個參數,例如:AjaxPro.Utility.RegisterTypeForAjax(typeof(_Default),Page);

             指定為Page就行了,否則會報錯顯示類型轉換失敗!

     2.     path的匹配問題,他不能匹配子目錄內的檔案,支援簡單的*、?萬用字元,例如:/page/*  -> 就只能匹配page目錄下的檔案 /page/*/* -> 能匹配page目錄下任意一級子目錄下的檔案。

     3.     在使用驗證碼的時候注意了,如果也是用Page頁返回並且在許可權控制範圍內的話注意要過濾掉!

 

遺留問題:

     1.     這樣做到底會不會造成效能上的損害?!

     2.     對於屬性IsResult仍然持不理解狀態!

 

結束

     歡迎大家交換意見,繼續探索許可權控制方面在ASP.NET中的解決方案:)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.