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
、和。FilterAttributes
CustomAttributes
Parameters
如果需要 MethodInfo,它当然是可行的,但它可能有点棘手。请记住,您的控制器可能有多个具有相同名称的操作;HttpGet 版本、HttpPost 版本等。
在这个例子中,我正在寻找动作的 [HttpPost] 版本:
var methodInfo = _type.GetMethods()
.SingleOrDefault(mi => mi.Name == filterContext.ActionDescriptor.ActionName &&
mi.GetCustomAttributes(false).Any(attr => attr is HttpGetAttribute));