Dot-Net

基於策略的授權與 .Net Core 中的角色授權

  • December 28, 2021

使用基於策略的授權和使用角色授權有什麼區別,或者沒有區別?

[Authorize(Policy = "RequiredAdminRole")]

[Authorize(Roles = "Admin")]

對於基於角色的授權,角色通過 ClaimsPrincipal 類的 IsInRole 方法向開發人員公開。

在我看來,如果您的意思是策略配置為

services.AddAuthorization(options =>
         options.AddPolicy("RequiredAdminRole",
         policy => policy.RequireRole("Admin"));
       }

RequireRole

public AuthorizationPolicyBuilder RequireRole(IEnumerable<string> roles)
   {
       if (roles == null)
       {
           throw new ArgumentNullException(nameof(roles));
       }

       Requirements.Add(new RolesAuthorizationRequirement(roles));
       return this;
   }

角色授權要求

public IEnumerable<string> AllowedRoles { get; }

   /// <summary>
   /// Makes a decision if authorization is allowed based on a specific requirement.
   /// </summary>
   /// <param name="context">The authorization context.</param>
   /// <param name="requirement">The requirement to evaluate.</param>

   protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement)
   {
       if (context.User != null)
       {
           bool found = false;
           if (requirement.AllowedRoles == null || !requirement.AllowedRoles.Any())
           {
               // Review: What do we want to do here?  No roles requested is auto success?
           }
           else
           {
               found = requirement.AllowedRoles.Any(r => context.User.IsInRole(r));
           }
           if (found)
           {
               context.Succeed(requirement);
           }
       }
       return Task.CompletedTask;
   }

您可以看到該策略只是檢查context.User.IsInRole("Admin").

基於策略的授權為您提供了更大的靈活性。您可以使用帶有策略的自定義授權處理程序來添加更複雜的邏輯,而不僅僅是檢查您的使用者是否具有特定角色。例如,您的數據庫中有一些角色映射。您可以創建一個策略來檢查您的使用者是否根據該數據獲得授權,或者可以是任何自定義邏輯。您還可以創建僅在.RequireRole("Admin")技術上與屬性相同[Authorize(Roles = "Admin")] 的策略查看如何在文件中實現自定義授權處理程序

引用自:https://stackoverflow.com/questions/58464970