【问题标题】:In C#, how can I allow users to different methods based on their individual roles?在 C# 中,如何允许用户根据各自的角色使用不同的方法?
【发布时间】: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

}

【问题讨论】:

    标签: c# asp.net asp.net-core


    【解决方案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();
          }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-16
        • 2016-02-12
        • 2014-04-05
        • 2013-03-23
        • 2017-09-17
        • 2012-08-23
        • 1970-01-01
        • 2017-05-01
        相关资源
        最近更新 更多