Asp.net

角色動態授權 asp.net core

  • November 27, 2020

這不是一個重複的問題,或者其他解決方案中給出的解決方案沒有奏效。

假設有一個控制器

[Authorize(Roles=//set dynamically)]
public IActionResult DashBoard(LoginModel model)
{
}

我已經嘗試了以下問題中的解決方案

  1. 添加角色以授權屬性
  2. 動態地將控制器操作權限分配給角色
  3. 動態添加角色以授權控制器的屬性(錯誤:處理方法 - 找不到合適的方法來覆蓋)
  4. 基於策略的授權可以更加動態嗎

所有這些解決方案都不起作用,因為介面中覆蓋的方法不存在(例如,authorizeAttribute 不包含 AuthorizeCore 的定義),或者在某些情況下 IServiceCollection 服務不包含特定方法

你不能那樣做。[Authorize(Roles=//set dynamically)]必須在編譯時知道。正如吹鏢的評論連結文章中指出的那樣,不鼓勵出於這個原因使用角色。

相反,您應該使用聲明和政策。聲明是細粒度的權限,例如“CreateCustomer”或“DeleteCustomer”或“ViewDashboard”。

所以你必須像使用它一樣

[Authorize(Policy = "ViewDashboard")]

這些策略需要在編譯時知道。

public class ViewDashboardRequirement : AuthorizationHandler<ViewDashboardRequirement>, IAuthorizationRequirement
{
   public override void Handle(AuthorizationContext context, ViewDashboardRequirement requirement)
   {
       if (context.User.HasClaim(c => c.Type == "dashboard:read"))
       {
           context.context.Succeed(requirement);
           return;
       }

       // only call fail if you do not want that other AuthorizationHandler may succeed with 
       // a different requirement
       // context.Fail();
   }
}

有關如何生成通用處理程序(而不是為每個策略編寫新的處理程序)的範例,請參見我的答案

這將允許您創建可配置的角色。現在您可以創建由聲明包組成的角色。每個索賠可能是一個政策。當使用者登錄時,您將屬於某個角色的聲明添加到使用者聲明列表中。

IE

  • 支持:ViewDashboard、ViewCustomers、ViewContacts、ManageCases(支持票)
  • 經理:ViewDashboard、ManageCustomers(查看、編輯、刪除)、ManageContacts(查看、編輯、刪除)
  • 管理員:ManageDashboard(查看、編輯)

等等

從評論更新。

您應該能夠使用 ASP.NET Core Identity 的聲明和角色聲明功能,而無需更改一行程式碼,因此您擁有IdentityRoleIdentityRoleClaim類。在執行時,您添加一個新的IdentityRole(即“管理器”),然後添加多個IdentityRoleClaim(每個權限/策略一個)

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