談起asp.net的系統控件,要說起RBAC的基本思想,RBAC,就是英文:role based access control,譯爲,基於訪問權限角色,在設計電子商務網站中常常要用到。 數據庫
電子商務系統對安全問題有較高的要求,傳統的訪問控制方法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概述 服務器
ASP.NET 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文件中存放邏輯。 函數
二、用戶控件(UserControl) 網站
爲了使用戶可以根據須要方便地定義控件,ASP.NET引入了 Web 窗體用戶控件的概念。實際上,只要將.aspx稍做修改便可轉換爲 Web 用戶控件,擴展名爲 .ascx,.ascx和.aspx文件同樣也有一個存放邏輯的代碼隱藏類文件,擴展名爲.ascx.vb或.ascx.cs,只是它不能做爲獨立 Web 窗體頁來運行,只有當被包含在 .aspx文件中時,用戶控件才能工做。 spa
經過如下兩個步驟在WEB窗體頁中設置用戶控件: .net
(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) 功能模塊表
爲了管理好用戶的權限,首先要組織好系統的模塊,爲此設計了一個功能模塊表。
表下:
每一個功能模塊所具備的子功能稱爲功能,如商品管理模塊goods(屬於功能模塊的範疇)包含商品信息查詢、商品信息更新、商品信息刪除、商品訂價信息查詢以及商品訂價信息更新五種功能,功能表的設計見表2。
上面提到的例子能夠做爲這樣幾條記錄分別插入功能模塊表和功能表。
角色表的設計關鍵在於角色值的定義,它是一個由0和1組成的相似二進制數的字符串。而功能表中的funcNo (功能編號)字段表示該功能在角色表的roleValue (角色值)字段中的位置,若是該位置對應的數值是0,表示該角色無此權限,若是值爲1,則表示該角色擁有此權限。如角色普通會員的角色值爲100100…00(共100位),如上所示,商品信息查詢的功能編號爲0,角色值100100…00的第0位爲1,因此該普通會員角色擁有商品信息查詢的功能;相反,該角色值的第1位爲0,而功能編號爲1 的功能爲商品信息更新,因此該普通會員角色沒有商品信息更新的權限。圖:
在將新角色普通會員插入數據庫時,先將角色值的全部位都置爲0,而後利用.NET Framework 類庫中的Replace函數將角色值中的打上勾的功能相應的功能編號位的值改成1。
例如,新添加一個角色名爲普通會員的角色,它擁有的功能爲商品信息查詢(功能編號0)和商品訂價信息查詢(功能編號3)兩項,則角色值應爲1001000……00(100位),即角色值中第0位和第3位的值爲1,其他爲0。
three,利用用戶控件實現訪問權限
在定義好用戶控件.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)方法。圖:
OK,介紹到這裏。