如何管理有权访问控制器的角色?

时间:2016-04-07 18:29:03

标签: 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(Roles = "monkey,donkey")]
public ActionResult Index() { return View(); }

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

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

1 个答案:

答案 0 :(得分:0)

我的做事方式是让BaseController看起来像这样:

[Authorize]
public class BaseController : Controller
{
}

然后项目中的每个其他控制器都应该从该控制器继承。我通常在基本控制器内部有一些辅助方法。

对于只有特定角色应该具有访问权限的区域,我会执行特定的控制器:

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

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

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