正文
?????Web.Config配置如下:
?????整個IHttpHandler實現代碼如下:
????///?本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中的解決方案:)
本文轉自over140 51CTO博客,原文鏈接:http://blog.51cto.com/over140/586473,如需轉載請自行聯系原作者