asp.net core系列 49 Identity 受權(上)

一.概述

         受權是指用戶可以訪問資源的權限,如頁面數據的查看、編輯、新增、刪除、導出、下載等權限。ASP.NET Core 受權提供了多種且靈活的方式,包括:Razor pages受權約定、簡單受權、Role角色受權、Claim聲明受權、Policy策略受權、資源受權、視圖受權。html

 

  1.1 Razor pages約定受權cookie

    Razor pages約定受權用於Razor page應用程序,以及MVC中的Identity  Razor Pages庫,不適應於MVC中的控制器和視圖。以下圖適用MVCIdentity 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

 

  參考文獻

    受權

相關文章
相關標籤/搜索