从AuthorizationHandlerContext对象

时间:2016-12-12 15:02:27

标签: asp.net asp.net-mvc asp.net-core access-control

您好,我有一个自定义需求处理程序,接受AuthorizationHandlerContext context参数

当我调试时,我可以看到上下文对象包含 Context.Resources.ActionDescription.ActionName

但是在编写代码时我不能超越 Context.Resources

似乎较低的等级没有暴露。我想获取调用处理程序的操作名称和控制器名称。我该怎么做?

3 个答案:

答案 0 :(得分:11)

var mvcContext = context.Resource as AuthorizationFilterContext;
var descriptor = mvcContext?.ActionDescriptor as ControllerActionDescriptor;
if (descriptor != null)
{
    var actionName = descriptor.ActionName;
    var ctrlName = descriptor.ControllerName;      
}

答案 1 :(得分:1)

即使问题被标记为,我也想补充一点,@ AdemCaglin的答案不适用于Web API控制器。以下代码适用于API和MVC控制器:

var endpoint = context.Resource as RouteEndpoint;
var descriptor = endpoint?.Metadata?
    .SingleOrDefault(md => md is ControllerActionDescriptor) as ControllerActionDescriptor;

if (descriptor == null)
    throw new InvalidOperationException("Unable to retrieve current action descriptor.");

var controllerName = descriptor.ControllerName;
var actionName = descriptor.ActionName;

答案 2 :(得分:1)

升级到 dotnet 5 后,我从 Carsten above 成功使用的解决方案停止工作。以下解决方法现在对我有用:

var routeValues = (context.Resource as HttpContext).Request.RouteValues;
var controllerName = routeValues["controller"].ToString();
var actionName = routeValues["action"].ToString();

请注意,这应该包括一些空检查等。以上是一个准系统示例。