0

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

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

有什么方法可以获取当前尝试访问的动作或控制器的类型和方法信息?

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

4

1 回答 1

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 是获取有关操作的一些常见信息的有用方法,例如ActionName、和。FilterAttributesCustomAttributesParameters

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

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

var methodInfo = _type.GetMethods()
    .SingleOrDefault(mi => mi.Name == filterContext.ActionDescriptor.ActionName &&
        mi.GetCustomAttributes(false).Any(attr => attr is HttpGetAttribute));
于 2013-10-08T00:49:22.080 回答