我有一个自定义
AuthorizationFilter
类来处理对我的 API 的授权。
现在,我需要通过向方法添加一些属性来增强它,这些属性将在
一些情况。
我可以从
actionContext.ControllerContext
获取控制器,但是:
我如何知道将从我的自定义
Controller
类的 IsAuthorized
方法中调用哪个 AuthorizeAttribute
方法?这样我就可以通过反射获取它的属性。
编辑:添加更多信息-
如果我接到这样的电话
localhost/api/myapi/?id=4
我想获取将在控制器中执行的方法的真实名称,例如 GetById(int id).
这样我就可以检查该方法是否有我需要添加的任何自定义属性。
在 Web api 2 中,您可以通过以下方式访问操作名称:
actionContext.ActionDescriptor.ActionName
你没有发布任何代码,但是你不能看看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.ControllerName actionContext.ActionDescriptor.ActionName
你可以从路线数据尝试这个
// Gets controller name
var controller = routeData.GetRequiredString("controller");
// Gets action name
var action = routeData.GetRequiredString("action");