如何从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
你没有发布任何代码,但你不能在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");