受權是指用戶可以訪問資源的權限,如頁面數據的查看、編輯、新增、刪除、導出、下載等權限。ASP.NET Core 受權提供了多種且靈活的方式,包括:Razor pages受權約定、簡單受權、Role角色受權、Claim聲明受權、Policy策略受權、資源受權、視圖受權。html
1.1 Razor pages約定受權cookie
Razor pages約定受權用於Razor page應用程序,以及MVC中的Identity Razor Pages庫,不適應於MVC中的控制器和視圖。以下圖適用MVC中Identity Razor Pages庫:mvc
對於Razor pages應用程序,訪問權限能夠在啓動時使用受權約定(Startup.cs),這些約定可爲用戶受權,並容許匿名用戶訪問各個頁面的文件夾。可使用cookie 身份驗證或ASP.NET Core Identity來進行受權約定。下面是MVC項目添加我的帳戶後,默認Razor pages約定受權配置以下:ui
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) .AddRazorPagesOptions(options => { options.AllowAreas = true; //須要受權的用戶(登陸成功),才能訪問區域文件夾(Identity/Account/Manage) options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage"); //須要受權的用戶(登陸成功),才能訪問區域頁面(Identity/Account/Logout.cshtml) options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout"); });
若是是Razor page應用程序,約定受權pages目錄下的頁面或文件夾(不帶區域),以下所示:spa
services.AddMvc() .AddRazorPagesOptions(options => { //須要受權訪問的頁面和文件夾。 options.Conventions.AuthorizePage("/Contact"); options.Conventions.AuthorizeFolder("/Private"); //容許匿名訪問的頁面和文件夾。 options.Conventions.AllowAnonymousToPage("/Private/PublicPage"); options.Conventions.AllowAnonymousToFolder("/Private/PublicPages"); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
下面是組合受權和匿名訪問:code
//受權訪問的文件夾和容許匿名的文件 .AuthorizeFolder("/Private").AllowAnonymousToPage("/Private/Public") //容許匿名訪問的文件夾和須要受權訪問的文件 .AllowAnonymousToFolder("/Public").AuthorizePage("/Public/Private")
1.2 簡單受權htm
簡單受權是任何通過身份驗證的用戶可以訪問的資源。使用過濾器屬性:受權[Authorize]或匿名[AllowAnonymous],[Authorize]對應AuthorizeFilter過濾器,在mvc中能夠應用於一個action或Controller,在razor page中能夠應用於一個頁面模型類PageModel,但不能應用於頁面處理程序方法。razor page中簡單受權以下所示:blog
//須要受權訪問的Logout頁面 [Authorize] public class LogoutModel : PageModel { //容許匿名訪問的Login頁面 [AllowAnonymous] public class LoginModel : PageModel {
注意:對於約定受權和簡單受權都是隻針對,通過身份驗證的用戶都能訪問的資源。也就是隻要登陸成功的用戶都能訪問的資源。ip
1.3 基於role角色受權 ci
當建立用戶時,它可能屬於一個或多個角色。好比:張三可能屬於管理員和用戶角色,同時李四隻是用戶角色。建立和管理這些角色取決於受權過程的後備存儲,角色驗證是經過ClaimsPrincipal類上的IsInRole方法,IsInRole檢查當前用戶屬於該角色,返回bool類型。關聯着role角色表、UserRole用戶關聯角色表。
基於角色的受權檢查是聲明性的,聲明在控制器或action上,檢查當前用戶請求資源的權限,用戶關聯角色, 檢查角色成員擁有的權限。
下面是限制AdministrationController
,只有
Administrator
角色成員的用戶才能訪問:
[Authorize(Roles = "Administrator")] public class AdministrationController : Controller { }
多個角色指定爲逗號分隔列表:
[Authorize(Roles = "HRManager,Finance")] public class SalaryController : Controller { }
在action級別應用其餘角色受權屬性,來進一步限制訪問:
[Authorize(Roles = "Administrator, PowerUser")] public class ControlPanelController : Controller { public ActionResult SetTime() { } [Authorize(Roles = "Administrator")] public ActionResult ShutDown() { } }
還能夠鎖定控制器(簡單受權),但容許匿名(未經身份驗證)對單個action訪問。
[Authorize] public class ControlPanelController : Controller { public ActionResult SetTime() { } [AllowAnonymous] public ActionResult Login() { } }
對於Razor Pages應用程序,可使用上面講的約定受權,也能夠運用AuthorizeAttribute到pageModel上,以下所示:
[Authorize(Policy = "RequireAdministratorRole")] public class UpdateModel : PageModel { public ActionResult OnPost() { } }
下面示例來演示role角色受權:
(1) 建立AdministrationController,應用Authorize。
[Authorize(Roles = "Administrator")] public class AdministrationController : Controller { public IActionResult Index() { return View(); } }
(2) 登陸成功後,訪問Administration資源,顯示拒絕,以下所示:
(3) 添加role角色表和UserRole用戶角色表
(4) 用戶退出,再登陸,訪問Administration資源,OK
1.4 基於Claim聲明受權
建立一個用戶時,它可能會分配一個或多個Claims聲明。Claims聲明是表示哪些使用者名稱值對。基於Claims聲明的受權,將檢查Claims聲明的值,並容許對基於該值資源的訪問。關聯着UserClaim用戶聲明表
(1) 添加Claims策略
首先在Startup.cs文件中,須要註冊策略policy,下面示例中策略名稱是EmployeeOnly, 策略類型ClaimType是EmployeeNumber,還能夠包括策略類型值。
services.AddAuthorization(options => { options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber")); //或者一個策略帶有claimType類型和requiredValues值 //options.AddPolicy("EmployeeOnly", policy => policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5")); });
(2) 將policy策略名稱應用在控制器上
[Authorize(Policy = "EmployeeOnly")] public class EmployeeController : Controller { // GET: /<controller>/ public IActionResult Index() { return View(); } }
(3) 用戶登陸,訪問Employee資源,訪問拒絕
(4) 在UserClaim聲明表插入一條數據(上面註冊EmployeeOnly聲明策略,只要求驗證claimType類型。因此表中claimvalue的1值不啓做用, 若是要表中claimvalue啓做用,能夠在註冊EmployeeOnly時輸入requiredValues值)
(5) 用戶退出,再登陸,訪問Employee資源,OK
參考文獻