【问题标题】:How to manage what roles that are authorized to access a controller?如何管理有权访问控制器的角色?
【发布时间】:2016-04-07 18:29:03
【问题描述】:

为将要访问控制器方法的角色添加授权的最直接方法是以下一种。

[Authorize]
public ActionResult Index() { return View(); }

当然,在直肠区域将每个方法都归因于这样是很痛苦的,因此任何想要保持理智的程序员都添加如下过滤器。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{ ... filters.Add(new AuthorizeAttribute()); }

现在,问题是当用户获得授权但没有声明任何角色时,他们仍然可以访问这些方法,这迫使我无论如何都要对每个方法使用以下语法。这让我很难过。

[Authorize(Roles = "monkey,donkey")]
public ActionResult Index() { return View(); }

我想知道的是一种添加这种全局过滤器但只允许某些角色的方法。到目前为止,我发现的最佳方法是指定过滤器的属性(一个偷偷摸摸的,因为它在构造函数列表中没有任何相关内容),如下所示。

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

【问题讨论】:

    标签: c# authorization asp.net-identity owin claims-based-identity


    【解决方案1】:

    我的做事方式是有一个看起来像这样的BaseController

    [Authorize]
    public class BaseController : Controller
    {
    }
    

    然后你项目中的所有其他控制器都应该继承自这个控制器。我通常在基本控制器中有一些辅助方法。

    对于只有特定角色才能访问的区域,我执行特定控制器:

    [Authorize(Role = "monkey")]
    public class MonkeyController : BaseController
    {
    }
    

    然后每个拥有这些权限的控制器都继承自MonkeyController

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

    【讨论】:

    • 我很好奇你把文件和基本控制器放在哪里。它是与其他控制器一起放在同一个文件夹中还是放在其他地方。很高兴知道其他人如何组织文件。
    • 是的,通常我的基本控制器与其他控制器位于同一文件夹中
    猜你喜欢
    • 2014-11-11
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2018-04-01
    • 2015-04-10
    • 2018-02-05
    相关资源
    最近更新 更多