MVC5+EF6 入門完整教程12--靈活控制Action權限

你們久等了。 html

本篇專題主要講述MVC中的權限方案。 前端

權限控制是每一個系統都必須解決的問題,也是園子裏討論最多的專題之一。 web

前面的系列文章中咱們用到了 SysUser, SysRole, SysUserRole 這幾個示例表。 數據庫

咱們以此爲基礎,完成RBAC (基於角色的控制) 的核心功能。 框架

在此給出個人最佳實踐,最終的效果是針對任意一個Action或Controller,均可以根據配置的角色來控制訪問權限。 ide

完成此核心功能後,能夠再往兩方面擴展經常使用功能: 學習

1. 能夠根據 組織/用戶/角色 的並集來控制權限 測試

2. 以此核心功能爲基礎,實現菜單的動態配置 spa

 

本篇文章將會先完成核心功能,擴展部分的內容在後續文章中再講。 3d

 

文章提綱

  • 概述要點
  • 理論基礎
  • 詳細步驟
  • 總結

概述要點(知識點)

1、MVC Form認證身份基礎

一般用法舉例:

1. web.config à system.web配置節下,開啓form認證

2. 須要認證的 Control或Action 上添加過濾,例如限制只有 Scott能夠訪問


 

 

 

 

還有其餘兩種經常使用形式,分別表示:

登陸用戶能夠訪問

[Authorize]

角色爲Admin的用戶能夠訪問

[Authorize(Roles = "Admin")]

過濾條件能夠加在Action或整個Controller上。

 

2、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上去,實現權限過濾

 

詳細步驟

下面是具體實現步驟。

1、啓用form認證,完成登陸/退出 基本功能

1. 啓用 form 認證

web.config à system.web配置節下,啓用form認證

 

2. 完成登陸/退出 基本功能

新建Controller: AccountController

登陸功能:

退出功能

 

對應的View(略,請直接查看源文件)

 

2、準備好權限配置文件

1. 用到的基礎數據:用戶,角色及用戶/角色 關係

 

2. 角色與Action對應的權限關係

這裏咱們先用一個XML代替,後續最終項目完成時會統一到DB中。

新建文件夾Config,新建ActionRoles文件,配置Action/Role的對應關係

說明:

Action未配置狀況下,默認有訪問權限;

Action 配置角色爲空,有訪問權限。

 

3、擴展 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 在蘇州高新區

完整目錄:

相關文章
相關標籤/搜索