一.概述
授權是指用戶能夠訪問資源的權限,如頁面數據的查看、編輯、新增、刪除、導出、下載等權限。ASP.NET Core 授權提供了多種且靈活的方式,包括:Razor pages授權約定、簡單授權、Role角色授權、Claim聲明授權、Policy策略授權、資源授權、視圖授權。
1.1 Razor pages約定授權
Razor pages約定授權用於Razor page應用程序,以及MVC中的Identity Razor Pages庫,不適應於MVC中的控制器和視圖。如下圖適用MVC中Identity Razor Pages庫:
對於Razor pages應用程序,訪問權限可以在啟動時使用授權約定(Startup.cs),這些約定可為用戶授權,並允許匿名用戶訪問各個頁面的文件夾。可以使用cookie 身份驗證或ASP.NET Core Identity來進行授權約定。下面是MVC項目添加個人賬戶后,默認Razor pages約定授權配置如下:
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目錄下的頁面或文件夾(不帶區域),如下所示:
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);
下面是組合授權和匿名訪問:
//授權訪問的文件夾和允許匿名的文件 .AuthorizeFolder("/Private").AllowAnonymousToPage("/Private/Public") //允許匿名訪問的文件夾和需要授權訪問的文件 .AllowAnonymousToFolder("/Public").AuthorizePage("/Public/Private")
1.2 簡單授權
簡單授權是任何經過身份驗證的用戶能夠訪問的資源。使用過濾器屬性:授權[Authorize]或匿名[AllowAnonymous],[Authorize]對應AuthorizeFilter過濾器,在mvc中可以應用於一個action或Controller,在razor page中可以應用於一個頁面模型類PageModel,但不能應用於頁面處理程序方法。razor page中簡單授權如下所示:
//需要授權訪問的Logout頁面 [Authorize] public class LogoutModel : PageModel { //允許匿名訪問的Login頁面 [AllowAnonymous] public class LoginModel : PageModel {
注意:對於約定授權和簡單授權都是只針對,經過身份驗證的用戶都能訪問的資源。也就是只要登錄成功的用戶都能訪問的資源。
1.3 基於role角色授權
當創建用戶時,它可能屬於一個或多個角色。比如:張三可能屬於管理員和用戶角色,同時李四只是用戶角色。創建和管理這些角色取決於授權過程的后備存儲,角色驗證是通過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
參考文獻