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


一.概述

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

 

  1.1 Razor pages約定授權

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

 

  參考文獻

    授權

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM