大家久等了。
本篇專題主要講述MVC中的許可權方案。
許可權控制是每個系統都必須解決的問題,也是園子裡討論最多的專題之一。
前面的系列文章中我們用到了 SysUser, SysRole, SysUserRole 這幾個示例表。
我們以此為基礎,完成RBAC (基於角色的控制) 的核心功能。
在此給出我的最佳實踐,最終的效果是針對任意一個Action或Controller,都可以根據配置的角色來控制訪問許可權。
完成此核心功能後,可以再往兩方面擴充套件常用功能:
1. 可以根據 組織/使用者/角色 的並集來控制許可權
2. 以此核心功能為基礎,實現選單的動態配置
本篇文章將會先完成核心功能,擴充套件部分的內容在後續文章中再講。
文章提綱
-
概述要點
-
理論基礎
-
詳細步驟
-
總結
概述要點(知識點)
一、MVC Form認證身份基礎
通常用法舉例:
1. web.config à system.web配置節下,開啟form認證
2. 需要認證的 Control或Action 上新增過濾,例如限制只有 Scott可以訪問
還有其他兩種常用形式,分別表示:
登入使用者可以訪問
[Authorize]
角色為Admin的使用者可以訪問
[Authorize(Roles = "Admin")]
過濾條件可以加在Action或整個Controller上。
二、MVC許可權過濾器擴充套件
上述解決方式中很明顯會發現有兩個缺點:
1. 修改許可權時需在Action, Controller上修改後需重新編譯,不靈活。
2.過濾器中的Role是內建物件,如果不使用ASP.NET自身的整合許可權方案,就無法按照角色來過濾。
解決這兩個問題,只需要擴充套件類AuthorizeAttribute即可。
理論基礎
為了能使用自定義的角色控制許可權,我們需要擴充套件或繞過 ASP.NET 的Membership和Role provider 框架。
1.擴充套件:實現自定義的 Membership/Role provider
2.繞過:直接不使用
我們選擇繞過的方式,這樣的話更加靈活。
(因為如果你的角色結構和系統不一致,用擴充套件的方式弄起來比較麻煩)
我們使用form認證的三個核心API, 只用這幾個API既可以減少工作量,又可以和Membership/Role provider保持獨立,魚和熊掌兼得。
1. FormsAuthentication.SetAuthCookie
使用者登入後,指定使用者名稱
2. Request.IsAuthenticated
登入後返回true
3. HttpContext.Current.User.Identity.Name
返回登入的使用者名稱
許可權過濾的完整過程:
1. Authetication ( 登入 )
登入成功後,呼叫 FormsAuthentication.SetAuthCookie 設定一個使用者名稱。
2. Authorization(授權)
新建自定義的授權屬性類:CustomAuthorizeAttribute(繼承於AuthorizeAtrribute),擴充套件許可權過濾器
3. 類似於預設Authorize attribute的使用方法,附加自定義的authorize attribute到controller或action上去,實現許可權過濾
詳細步驟
下面是具體實現步驟。
一、啟用form認證,完成登入/退出 基本功能
1. 啟用 form 認證
web.config à system.web配置節下,啟用form認證
2. 完成登入/退出 基本功能
新建Controller: AccountController
登入功能:
退出功能
對應的View(略,請直接檢視原始檔)
二、準備好許可權配置檔案
1. 用到的基礎資料:使用者,角色及使用者/角色 關係
2. 角色與Action對應的許可權關係
這裡我們先用一個XML代替,後續最終專案完成時會統一到DB中。
新建資料夾Config,新建ActionRoles檔案,配置Action/Role的對應關係
說明:
Action未配置情況下,預設有訪問許可權;
Action 配置角色為空,有訪問許可權。
三、擴充套件 AuthorizeAttribute
1. 新建類CustomAuthorizeAttribute,繼承與AuthorizeAttribute
override兩個方法:
a. 在請求授權時呼叫:
b. 提供一個入口點用於自定義授權檢查,通過為true
具體實現:
以上使用的GetActionRoles的實現:
總結
至此,許可權控制的整個過程就OK了,我們來測試一下。
新建HomeController, 新建一些Action做測試(Index, About,Contact)
回顧一下基礎資料。
Scott 角色為 General Users
XML配置為:
我們把整個HomeController 上都加上 [CustomAuthorize]
使用場景舉例:
1. Index 配置為空,任何人都能訪問
2. About 配置為Manager, Administrators, General Users 可以訪問
未登入時跳轉至登入介面
3. Contact配置為 Administrators可以訪問
scott的角色為General Users, 不在許可權表裡,登入不進去此頁面
另外補充說明:
如下圖,可以設定為全域性。
這樣就不需要單個設定,對所有Action應用自定義過濾條件。
歡迎大家多多評論和支援,祝學習進步 :)
PS.
另外公司研發部招聘工程師2名(R語言方向 & .NET開發方向),主要研發資料視覺化相關新產品,有興趣的可以部落格園短訊息聯絡我。
base 在蘇州高新區
完整目錄:
- MVC5+EF6 入門完整教程12--靈活控制Action許可權 @20160504
- MVC5+EF6 入門完整教程11--細說MVC中倉儲模式的應用 @20150914
- MVC5+EF6 入門完整教程10:多對多關聯表更新&使用原生SQL@20150521
- MVC5+EF6 入門完整教程9:多表資料載入@20150212
- MVC5+EF6 入門完整教程8 :不丟失資料進行資料庫結構升級 @20141215
- MVC5+EF6 入門完整教程7 :排序過濾分頁 @20141201
- MVC5+EF6 入門完整教程6 :分部檢視(Partial View) @20141117
- MVC5+EF6 入門完整教程5 :UI的一些改造 @20141113
- MVC5+EF6 入門完整教程4 :EF基本的CRUD @20141104
- MVC5+EF6 入門完整教程3 :EF完整開發流程 @20141027
- MVC5+EF6 入門完整教程2 :從前端UI開始 @20141021
- MVC5+EF6 入門完整教程1 :從0開始