ASP.NET系統使用者許可權設計

iDotNetSpace發表於2009-01-05
電子商務系統對安全問題有較高的要求,傳統的訪問控制方法DAC(Discretionary Access Control,自主訪問控制模型)、MAC(Mandatory Access Control,強制訪問控制模型)難以滿足複雜的企業環境需求。因此,NIST(National Institute of Standards and Technology,美國國家標準化和技術委員會)於90年代初提出了基於角色的訪問控制方法,實現了使用者與訪問許可權的邏輯分離,更符合企業的使用者、組織、資料和應用特徵。ASP.NET是微軟為了抗衡JSP而推出的新一代ASP(Active Server Pages)指令碼語言,它借鑑了JSP的優點,同時它又具有自身的一些新特點。

  本文將首先介紹ASP.NET的基本情況和RBAC(Role Based Access Control)的基本思想,在此基礎上,給出電子商務系統中實現使用者許可權控制的一種具體方法。

  ASP.NET概述

  1、ASP.NET

  ASP.NET是微軟流行的動態WEB程式設計技術活動伺服器網頁(ASP)的最新版本,但它遠不是傳統ASP簡單升級。ASP.NET和ASP的最大區別在於程式設計思維的轉換,ASP.NET是真正的物件導向(Object-oriented),而不僅僅在於功能的增強。

  在ASP.NET中,Web 窗體頁由兩部分組成:視覺元素(HTML、伺服器控制元件和靜態文字)和該頁的程式設計邏輯。其中每一部分都儲存在一個單獨的檔案中。可視元素在一個副檔名為 .aspx 檔案中建立,而程式碼位於一個單獨的類檔案中,該檔案稱作程式碼隱藏類副檔名為.aspx.vb 或 .aspx.cs。這樣,.aspx檔案中存放所有要顯示的元素,aspx.vb或.aspx.cs檔案中存放邏輯。

  2、使用者控制元件(UserControl)

  為了使使用者能夠根據需要方便地定義控制元件,ASP.NET引入了 Web 窗體使用者控制元件的概念。實際上,只要將.aspx稍作修改即可轉換為 Web 使用者控制元件,副檔名為 .ascx,.ascx和.aspx檔案一樣也有一個存放邏輯的程式碼隱藏類檔案,副檔名為.ascx.vb或.ascx.cs,只是它不能作為獨立 Web 窗體頁來執行,只有當被包含在 .aspx檔案中時,使用者控制元件才能工作。

  通過以下兩個步驟在WEB窗體頁中設定使用者控制元件:

  (1)使用@ Register指令在.aspx檔案中註冊使用者控制元件。如要註冊在放在相對路徑“../UserControl/”下的標頭檔案headinner.ascx的方法為:

<%@ Register TagPrefix="Acme" TagName="Head" Src="../UserControl/headinner.ascx" %>

  (2)在伺服器控制元件的開始標記和結束標記之間(<form. runat=server> </form>) 宣告該使用者控制元件元素。例如要宣告上面所匯入的控制元件的語法為:

<Acme: Head runat="server"/>

  這樣,該控制元件就成為頁的一部分,並將在處理該頁時呈現出來。並且,該控制元件的公共屬性、事件和方法將向 Web 窗體頁公開並且可以通過程式設計來使用。根據這個原理,就可以將每個頁面初始化時所要執行的操作(如登入驗證,角色驗證)封裝在使用者控制元件當中。

  RBAC的基本思想

  RBAC(角色訪問控制)的基本思想可簡單地用圖1來表示,即把整個訪問控制過程分成兩步:訪問許可權與角色相關聯,角色再與使用者關聯,從而實現了使用者與訪問許可權的邏輯分離。

  由於RBAC實現了使用者與訪問許可權的邏輯分離,因此它極大的方便了許可權管理。例如,如果一個使用者的職位發生變化,只要將使用者當前的角色去掉,加入代表新職務或新任務的角色即可,角色/許可權之間的變化比角色/使用者關係之間的變化相對要慢得多,並且委派使用者到角色不需要很多技術,可以由行政管理人員來執行,而配置許可權到角色的工作比較複雜,需要一定的技術,可以由專門的技術人員來承擔,但是不給他們委派使用者的許可權,這與現實中情況正好一致。

  使用者許可權在.NET中的設計與實現

  利用.NET中的使用者控制元件實現許可權控制的基本思想是:根據角色訪問控制(RBAC)的基本原理,給使用者分配一個角色,每個角色對應一些許可權,然後利用ASP.NET中的使用者控制元件(UserControl)來判斷該使用者對應的角色是否對訪問頁面有訪問的權力。

  下面將從資料庫設計、新增角色和使用者控制元件的使用等三方面來闡述具體實現過程。

  1、資料庫中表的設計

  首先,在資料庫中設計功能模組表、功能表和角色表等三個表。

  (1) 功能模組表

  為了管理好使用者的許可權,首先要組織好系統的模組,為此設計了一個功能模組表。見表1。

  ASP.NET系統使用者許可權設計

  (2) 功能表

  ASP.NET系統使用者許可權設計

  每個功能模組所具有的子功能稱為功能,如商品管理模組goods(屬於功能模組的範疇)包含商品資訊查詢、商品資訊更新、商品資訊刪除、商品定價資訊查詢以及商品定價資訊更新五種功能,功能表的設計見表2。

  上面提到的例子可以作為這樣幾條記錄分別插入功能模組表和功能表。

  ASP.NET系統使用者許可權設計

insert into TModule values(0,'商品管理模組','goods',5);
insert into Tfunction values(0,'商品資訊查詢','selectgoods',0);
insert into Tfunction values(1,'商品資訊更新','updategoods',0);
insert into Tfunction values(2,'商品資訊刪除','deletegoods',0);
insert into Tfunction values(3,'商品定價資訊查詢','selectgoodsprice',0);
insert into Tfunction values(4,'商品定價資訊更新','updategoodsprice',0);

  (3) 角色表

  ASP.NET系統使用者許可權設計

  角色表的設計關鍵在於角色值的定義,它是一個由0和1組成的類似二進位制數的字串。而功能表中的funcNo (功能編號)欄位表示該功能在角色表的roleValue (角色值)欄位中的位置,如果該位置對應的數值是0,表示該角色無此許可權,如果值為1,則表示該角色擁有此許可權。如角色普通會員的角色值為100100…00(共100位),如上所示,商品資訊查詢的功能編號為0,角色值100100…00的第0位為1,所以該普通會員角色擁有商品資訊查詢的功能;相反,該角色值的第1位為0,而功能編號為1 的功能為商品資訊更新,所以該普通會員角色沒有商品資訊更新的許可權。它們的關係可由圖2來表示。

  ASP.NET系統使用者許可權設計


  2、角色的新增

  有了上面幾個表,角色頁面的功能模組以及其對應的功能都可以從功能模組表和功能表中讀出,如圖3所示。

  ASP.NET系統使用者許可權設計

  在將新角色普通會員插入資料庫時,先將角色值的所有位都置為0,然後利用.NET Framework 類庫中的Replace函式將角色值中的打上勾的功能相應的功能編號位的值改為1。

  例如,新新增一個角色名為普通會員的角色,它擁有的功能為商品資訊查詢(功能編號0)和商品定價資訊查詢(功能編號3)兩項,則角色值應為1001000……00(100位),即角色值中第0位和第3位的值為1,其餘為0。

  3、利用使用者控制元件實現訪問許可權

  在定義好使用者控制元件.ascx檔案(head.ascx)及.ascx.cs(head.ascx,cs)檔案時,接下去只要在.aspx檔案中註冊和宣告它就可以了。

  (1) 註冊

<%@ Register TagPrefix="Acme" TagName="Head" Src="../UserControl/headinner.ascx" %>

  (2) 宣告

  經過實踐,在.aspx檔案中宣告.ascx檔案可分為幾種情況:

  第一種情況:<Acme:Head runat="server" />

  第二種情況:<Acme:Head runat="server" flag=0 funcname1=selectgoods funcname2=updategoods />

  第三種情況:<Acme: Head runat="server" flag=1 funcname1= selectgoods funcname2=updategoods />

  欄位flag是用來控制怎樣進行許可權檢查的標誌,funcname指功能表中的功能英文名。如果flag為空,則不執行許可權檢查(第一種情況);否則如果flag=="0",則表示同時具有selectgoods(商品資訊查詢)和 updategoods(商品資訊更新)這兩種許可權的角色所對應的使用者才有權利檢視該頁(第二種情況);否則,如果flag=="1",則認為,具有selectgoods(商品資訊查詢)或 updategoods(商品資訊更新)這兩種許可權中任意一種許可權的使用者就有權利檢視該頁(第三種情況)。

  上面進行許可權檢查的過程全部由使用者控制元件來實現,其全部方法都封裝在.ascx.cs檔案中,其中最主要的一個方法是檢查某一角色是否擁有某一確定許可權的checkAuth(string roleId,string funcEName)方法。這個方法的思想如圖4所示。

  ASP.NET系統使用者許可權設計

  圖4中roleValue(角色值)的第0位(selectgoods的功能編號)值為1,表示該角色擁有selectgoods(商品資訊查詢)的許可權。這樣,我們把對許可權檢查的所有邏輯都封裝在了使用者控制元件中,因此,對WEB窗體頁.aspx檔案而言,只需在匯入.ascx檔案時確定使用者在訪問該頁面時所應擁有的許可權,而不需對aspx.cs進行任何改動。

  由上所述,可以很清楚地看出,只要在使用者控制元件中對使用者許可權進行控制,再把它包括在.aspx檔案中(這件事作者本來就是要做的),那麼在程式設計的時候就不必考慮複雜的許可權問題了。

  結束語

  本文在開發一個電子商務系統的實踐中發現,公司對系統使用者的許可權控制非常重視。因此,設計一個簡單方便又行之有效的許可權控制機制對於電子商務系統是必不可少的。本文所提出的基於ASP.NET的電子商務系統使用者許可權設計和實現方法已經在實際的工作中得到了驗證,修改指定許可權組的操作變得非常方便。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-526844/,如需轉載,請註明出處,否則將追究法律責任。

相關文章