在 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 个角色 - Admin
、Manager
和 Writer
。
HomeController
内部有一些方法,其中大多数对Admin
和Manager
都是通用的,少数仅用于Admin
,很少用于Writer
。大约有30种方法。 Admin 和 Manager 使用 25 个,仅 Adminin 使用 1-2 个。 1-2 代表所有 3 个角色。
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# 中,如何允许用户根据各自的角色使用不同的方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据用户角色(尤其是可变产品)显示不同的产品价格? [复制]