如何访问控制器的授权角色?

时间:2015-07-16 11:55:05

标签: c# asp.net-mvc

我有一个带有授权控制器的asp mvc应用程序。 是否可以访问角色字符串的内容?

[Authorize(Roles = "Medialen, Admin, Verkoop, Medewerker")]
public class BaseController : Controller
{

因此,对于上面的控制器,它应该返回" Medialen,Admin,Verkoop,Medewerker"

2 个答案:

答案 0 :(得分:2)

您可以使用反射来抓取属性定义,如下所示。

public ActionResult SOmeAction()
{
   //this refers to controller, GetCustomAttribute looks for attribute on controller
   //GetCustomAttribute is a 4.5 extension method
   var attrib = this.GetType().GetCustomAttribute<AuthorizeAttribute>();
   if (attrib != null)
   {
      var roles = attrib.Roles;
   }
}

所以它看一下控制器级别;它也可以增强以查看方法。我假设您正在尝试从动作方法中获取此信息,但您也可以始终从过滤器属性中获取它,具体取决于您希望如何使用它。

答案 1 :(得分:1)

Brian Mains的答案实际上是正确的,但存在另一种变体如何做到这一点:

您可以创建自定义属性,该属性继承自Authorize属性并在OnAuthorization Method中执行操作。

public class YourAuthorizationAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var roles = this.Roles;            
        //your things   
        base.OnAuthorization(filterContext);
    }    
}

然后将其与您的操作或控制器一起使用

[YourAuthorizationAttribute (Roles = "Medialen, Admin, Verkoop, Medewerker")]

如果你有系统中所有现有角色的列表,还存在另一个愚蠢的变体获取当前角色的行动:

public ActionResult Index()
{
     var roles = GetListOfRoles(); //Get all list of roles, for example from db
     var currentRoles = roles.Where(User.IsInRole);
     ....
}

但如果你想要一些安全的检查,第一个更好。