MVC5+EF6 入門完整教程11--細說MVC中倉儲模式的應用

來源:互聯網
上載者:User

標籤:內容   源檔案   理論   over   form   text   ati   name   provider   

大家久等了。

本篇專題主要講述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應用自訂過濾條件。

 

歡迎大家多多評論和支援,祝學習進步 :)

MVC5+EF6 入門完整教程11--細說MVC中倉儲模式的應用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.