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

在C#中,如何允许用户根据各自的角色使用不同的方法?,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,目前有3个角色-Admin、Manager和Writer。 在HomeController中有一些方法,其中大多数对于Admin和Manager都是通用的,很少只用于Admin,很少用于Writer。大约有30种方法。管理员和经理通常有25个,只有Admnin有1-2个。3个角色中的1-2个 每个人只能使用一个名为ForWriterOnly()的方法 Writer不应该有权访问任何其他方法,但是Admin和Manager应该有权访问 有些方法只适用于管理员,而不适用于管理员和编写器 实现上述

目前有3个角色-
Admin
Manager
Writer
。 在
HomeController
中有一些方法,其中大多数对于
Admin
Manager
都是通用的,很少只用于
Admin
,很少用于
Writer
。大约有30种方法。管理员和经理通常有25个,只有Admnin有1-2个。3个角色中的1-2个

  • 每个人只能使用一个名为
    ForWriterOnly()
    的方法
  • Writer不应该有权访问任何其他方法,但是Admin和Manager应该有权访问
  • 有些方法只适用于管理员,而不适用于管理员和编写器
实现上述三种情况的最佳方法是什么?除了
ForWriterOnly()
,我如何排除大多数其他方法的Writer?我如何排除访问其他方法的
Admin

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

请对我的代码进行修改,以便更容易理解。


[Authorize(Roles=“Admin,Manager,Writer”)]
公共类HomeController:控制器
{
ForEveryone()的公共异步任务
{
返回视图();
}
dminandmanager()的公共异步任务
{
返回视图();
}
ForWriterOnly()的公共异步任务
{
返回视图();
}
AdminOnly()的公共异步任务
{
返回视图();
}
dminandmanager1()的公共异步任务
{
返回视图();
}
dminandmanager2()的公共异步任务
{
返回视图();
}
...........
//还有大约30种其他方法对于管理员和经理来说都很常见
}

首先,如果您在控制器上方使用
[Authorize(Roles=“Admin,Manager,Writer”)]
,则这将提供对整个家庭控制器及其对管理员,经理,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();
        }
}

//通常只有经过身份验证的用户才能访问控制器。
[授权]
公共类HomeController:控制器
{
//在这里,您希望每个人都能访问您的操作。
//所以你不必在这里给出任何属性。
ForEveryone()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin,Manager”)]
dminandmanager()的公共异步任务
{
返回视图();
}
[授权(Roles=“Writer”)]
ForWriterOnly()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin”)]
AdminOnly()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin,Manager”)]
dminandmanager1()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin,Manager”)]
dminandmanager2()的公共异步任务
{
返回视图();
}
}

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

如果使用控制器上方的[Authorize]。您应该使用[AllowAnonymous]执行希望所有人都能访问的操作

[授权]
公共类HomeController:控制器
{
[异名]
ForEveryone()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin,Manager”)]
dminandmanager()的公共异步任务
{
返回视图();
}
[授权(Roles=“Writer”)]
ForWriterOnly()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin”)]
AdminOnly()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin,Manager”)]
dminandmanager1()的公共异步任务
{
返回视图();
}
[授权(Roles=“Admin,Manager”)]
dminandmanager2()的公共异步任务
{
返回视图();
}
}

 // 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();
        }
}

 [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();
    }