在 C# 中,如何允许用户根据各自的角色使用不同的方法?

Posted

技术标签:

【中文标题】在 C# 中,如何允许用户根据各自的角色使用不同的方法?【英文标题】:In C#, how can I allow users to different methods based on their individual roles? 【发布时间】:2020-04-24 19:05:46 【问题描述】:

目前有 3 个角色 - AdminManagerWriterHomeController 内部有一些方法,其中大多数对AdminManager 都是通用的,少数仅用于Admin,很少用于Writer。大约有30种方法。 Admin 和 Manager 使用 25 个,仅 Adminin 使用 1-2 个。 1-2 代表所有 3 个角色。

每个人都应该只能使用 1 个名为 ForWriterOnly() 的方法 编写者不应有权访问任何其他方法,但管理员和经理应有权访问 有些方法只适用于 Admin,不适用于 Manager 和 Writer

实现上述 3 种情况的最佳方法是什么?对于除 ForWriterOnly() 之外的大多数其他方法,我如何排除 Writer ?以及如何排除Admin 以访问其他一些方法?

我知道我可以为 Admin 和 Manager 的 25 种常用方法写 [Authorize(Roles = "Admin, Manager")],但我正在寻找更简单的解决方案。

请修改我的代码,以便于理解。


 [Authorize(Roles = "Admin, Manager, Writer")]
 public class HomeController : Controller
 

        public async Task<IActionResult> ForEveryone()
        
            return View();
        

        public async Task<IActionResult> ForAdminAndManager()
        
            return View();
        

        public async Task<IActionResult> ForWriterOnly()
        
            return View();
        

        public async Task<IActionResult> ForAdminOnly()
        
            return View();
        

        public async Task<IActionResult> ForAdminAndManager1()
        
            return View();
        

        public async Task<IActionResult> ForAdminAndManager2()
        
            return View();
        
        ...........
        // There are around 30 other methods which are common for both Admin and Manager


【问题讨论】:

【参考方案1】:

首先,如果您在控制器上方使用[Authorize(Roles = "Admin, Manager, Writer")],那么这将提供对整个 HomeController 及其对 Admin、Manager、Writer 角色的操作的访问权限。

有几种方法可以实现这一点,但我认为我会分开我的控制器。但为简单起见,我将继续介绍您的情况。

 // Normally your controller will be accessible by only Authenticated users.
 [Authorize]
 public class HomeController : Controller
 

        //In here you want your action to be accessible by everyone.
        //So you dont have to give any attributes in here.
        public async Task<IActionResult> ForEveryone()
        
            return View();
        

        [Authorize(Roles = "Admin, Manager")]
        public async Task<IActionResult> ForAdminAndManager()
        
            return View();
        

        [Authorize(Roles = "Writer")]
        public async Task<IActionResult> ForWriterOnly()
        
            return View();
        

        [Authorize (Roles = "Admin")]
        public async Task<IActionResult> ForAdminOnly()
        
            return View();
        

        [Authorize(Roles = "Admin, Manager")]
        public async Task<IActionResult> ForAdminAndManager1()
        
            return View();
        

        [Authorize(Roles = "Admin, Manager")]
        public async Task<IActionResult> ForAdminAndManager2()
        
            return View();
        


【讨论】:

【参考方案2】:

您可以为每个操作指定角色。

Allow multiple roles to access controller action

如果在Controller之上使用[Authorize]。您应该将 [AllowAnonymous] 用于您希望每个人都可以访问的操作。

Role-based authorization in ASP.NET Core

 [Authorize]
 public class HomeController : Controller
 
    [AllowAnonymous]
    public async Task<IActionResult> ForEveryone()
    
        return View();
    

    [Authorize(Roles = "Admin, Manager")]
    public async Task<IActionResult> ForAdminAndManager()
    
        return View();
    

    [Authorize(Roles = "Writer")]
    public async Task<IActionResult> ForWriterOnly()
    
        return View();
    

    [Authorize (Roles = "Admin")]
    public async Task<IActionResult> ForAdminOnly()
    
        return View();
    

    [Authorize(Roles = "Admin, Manager")]
    public async Task<IActionResult> ForAdminAndManager1()
    
        return View();
    

    [Authorize(Roles = "Admin, Manager")]
    public async Task<IActionResult> ForAdminAndManager2()
    
        return View();
    

【讨论】:

以上是关于在 C# 中,如何允许用户根据各自的角色使用不同的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户的角色创建具有不同显示的视图?

在 C# 应用程序中处理不同用户角色的推荐方法是啥?

如何根据用户角色(尤其是可变产品)显示不同的产品价格? [复制]

根据 Woocommerce 中的用户角色自定义客户新帐户邮件

用户角色的不同目标 URL

如何让每个用户根据他们在 JAAS 中的权限/角色访问特定位置的资源?