如何从Web API授权过滤器中知道将调用哪个控制器方法

本文关键字:调用 方法 控制器 Web API 过滤器 授权 | 更新日期: 2023-09-27 18:21:38

我有一个自定义AuthorizationFilter类来处理对API的授权。现在,我需要通过向方法添加一些属性来增强它,这些属性将在有些情况。

我可以从actionContext.ControllerContext获得控制器,但是:

如何知道将从自定义AuthorizeAttribute类的IsAuthorized方法调用哪个Controller方法?所以我可以通过反射得到它的属性。

编辑:添加更多信息-

如果我接到localhost/api/myapi/?id=4这样的电话我想得到将在控制器中执行的方法的真实名称,如GetById(int id).

这样我就可以检查这个方法是否有我需要添加的自定义属性

在web api 2中,您可以使用访问操作名称

actionContext.ActionDescriptor.ActionName

如何从Web API授权过滤器中知道将调用哪个控制器方法

你没有发布任何代码,但你不能在HttpActionContext中查看RouteData吗?

 public class MyAuthAttribute : AuthorizeAttribute
 {
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        var routeData = actionContext.ControllerContext.RouteData;
        //If you don't have an action name, I've assumed "index" is the default.
        var actionName = routeData.Values.ContainsKey("id") ? routeData.Values["id"].ToString() : "Index";
        //you can then get the method via reflection...
        var attribs = actionContext.ControllerContext.Controller.GetType()
                    .GetMethod(actionName, BindingFlags.Public | BindingFlags.Instance)
                    .GetCustomAttributes();
        //Do something...
        return base.IsAuthorized(actionContext);
    }
}

我使用这些来获取ActionFilterAttribute 中的所有描述符和参数

actionContext.ActionArguments["selectorString"]actionContext.ActionDescriptor.ControllerDescriptor.CntrollerNameactionContext.ActionDescriptor.ActionName

你可以从路由数据中尝试

// Gets controller name    
var controller = routeData.GetRequiredString("controller");
// Gets action name
var action = routeData.GetRequiredString("action");