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

问题描述 投票:0回答:4

我有一个自定义

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

我可以从

actionContext.ControllerContext
获取控制器,但是:

我如何知道将从我的自定义

Controller
类的
IsAuthorized
方法中调用哪个
AuthorizeAttribute
方法?这样我就可以通过反射获取它的属性。

编辑:添加更多信息-

如果我接到这样的电话

localhost/api/myapi/?id=4
我想获取将在控制器中执行的方法的真实名称,例如
GetById(int id).

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

c# .net asp.net-mvc-4 authorization
4个回答
29
投票

在 Web api 2 中,您可以通过以下方式访问操作名称:

actionContext.ActionDescriptor.ActionName

1
投票

你没有发布任何代码,但是你不能看看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);
    }
}

1
投票

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

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


0
投票

你可以从路线数据尝试这个

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

// Gets action name
var action = routeData.GetRequiredString("action");
© www.soinside.com 2019 - 2024. All rights reserved.