AuthorizeAttribute AuthorizeCore中的MVC4控制器类型和操作方法信息

时间:2013-10-07 23:11:17

标签: c# asp.net-mvc-4 authorization

我正在尝试创建一个授权系统,允许我使用来自Controllers Type和Actions MethodInfo的各种数据来检查用户是否有权访问我系统的该部分。

public class NewAuth : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var Type = ControllerTypeHere;
        var MethodInfo = ActionMethodInfoHere;
    }
}

有没有办法获取当前正在尝试访问的操作或控制器的类型和方法信息?

如果需要,我可以提供任何其他信息。

1 个答案:

答案 0 :(得分:4)

OnAuthorization是获取有关请求的一些信息的好方法。

让我们对您的代码进行一些修改。

public class NewAuth : AuthorizeAttribute
{
    private Type _type;
    private ActionDescriptor _actionDescriptor;

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        _type = filterContext.Controller.GetType();
        _actionDescriptor = filterContext.ActionDescriptor;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // use _type
        // use _actionDescriptor
        return true;
    }
}
首先触发

OnAuthorization,因此在调用AuthorizationCore时将设置变量。您会注意到我已将MethodInfo的概念更改为ActionDescriptor。它们不是可互换的,但ActionDescriptor是一种有用的方式,可以获取有关此操作的一些常见信息,例如ActionNameFilterAttributesCustomAttributesParameters

如果需要MethodInfo,它肯定是可行的,但它可能有点棘手。请记住,您的控制器可能有多个具有相同名称的操作;一个HttpGet版本,HttpPost版本等。

在这个例子中,我正在寻找动作的[HttpPost]版本:

var methodInfo = _type.GetMethods()
    .SingleOrDefault(mi => mi.Name == filterContext.ActionDescriptor.ActionName &&
        mi.GetCustomAttributes(false).Any(attr => attr is HttpGetAttribute));