Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何管理授权访问控制器的角色?_C#_Authorization_Asp.net Identity_Owin_Claims Based Identity - Fatal编程技术网

C# 如何管理授权访问控制器的角色?

C# 如何管理授权访问控制器的角色?,c#,authorization,asp.net-identity,owin,claims-based-identity,C#,Authorization,Asp.net Identity,Owin,Claims Based Identity,下面是添加访问控制器方法的角色授权的最直接的方法 [Authorize] public ActionResult Index() { return View(); } 当然,将每个方法都归为属性是一件痛苦的事情,因此任何想要保持理智的程序员都会添加如下过滤器 public static void RegisterGlobalFilters(GlobalFilterCollection filters) { ... filters.Add(new AuthorizeAttribute()); }

下面是添加访问控制器方法的角色授权的最直接的方法

[Authorize]
public ActionResult Index() { return View(); }
当然,将每个方法都归为属性是一件痛苦的事情,因此任何想要保持理智的程序员都会添加如下过滤器

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{ ... filters.Add(new AuthorizeAttribute()); }
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{ ... filters.Add(new AuthorizeAttribute { Roles = "monkey,donkey" }); }
现在的问题是,当用户被授权但没有角色声明时,他们仍然可以访问这些方法,这迫使我对每个方法都使用以下语法。这让我很难过

[Authorize(Roles = "monkey,donkey")]
public ActionResult Index() { return View(); }
我想知道的是如何添加这样一个全局过滤器,但只允许某些角色。到目前为止,我发现的最好的方法是指定过滤器的属性(一个狡猾的属性,因为它在构造函数列表中对此一无所知),如下所示

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{ ... filters.Add(new AuthorizeAttribute()); }
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{ ... filters.Add(new AuthorizeAttribute { Roles = "monkey,donkey" }); }
  • 这是推荐的方法还是有更可靠的方法
  • 如果我只想将筛选器添加到某些方法/控制器,我如何控制
  • 如何允许匿名访问某些方法/控制器

  • 我的做法是拥有一个
    BaseController
    ,它看起来像这样:

    [Authorize]
    public class BaseController : Controller
    {
    }
    
    然后,项目中的每个其他控制器都应从该控制器继承。我通常在基本控制器中有一些助手方法

    对于只有特定角色才应具有访问权限的区域,我会指定一个特定的控制器:

    [Authorize(Role = "monkey")]
    public class MonkeyController : BaseController
    {
    }
    
    然后,具有这些权限的每个控制器都继承自
    MonkeyController


    对于匿名访问,请在控制器或操作上使用
    [AllowAnonymous]

    我很好奇您将基本控制器的文件放在哪里。它与其他控制器放在同一文件夹中,还是放在其他地方。很高兴知道其他人如何组织文件。是的,通常我的基本控制器与其他控制器位于同一文件夹中