Asp.net mvc 4 如何在授权筛选器MVC 4之前执行操作筛选器

Asp.net mvc 4 如何在授权筛选器MVC 4之前执行操作筛选器,asp.net-mvc-4,custom-attributes,Asp.net Mvc 4,Custom Attributes,通过继承AuthorizeAttribute类,我在MVC4中实现了自己的自定义授权属性。我还有一个自定义的ActionFilterAttribute。这两种方法都很好,但问题在于如何对它们进行排序。我需要在自定义授权筛选器之前运行自定义操作筛选器 我已尝试对属性使用Order属性,但据我所知,授权筛选器将始终在操作筛选器之前运行 是否有人知道如何在授权筛选器之前强制执行操作筛选器???当您查看源代码(可在上获得)时,您会发现这在标准筛选器类中是不可能的IAuthorizationFilter实

通过继承
AuthorizeAttribute
类,我在MVC4中实现了自己的自定义授权属性。我还有一个自定义的
ActionFilterAttribute
。这两种方法都很好,但问题在于如何对它们进行排序。我需要在自定义授权筛选器之前运行自定义操作筛选器

我已尝试对属性使用
Order
属性,但据我所知,授权筛选器将始终在操作筛选器之前运行


是否有人知道如何在授权筛选器之前强制执行操作筛选器???

当您查看源代码(可在上获得)时,您会发现这在标准筛选器类中是不可能的<代码>IAuthorizationFilter实现总是在
IActionFilter
实现之前执行。这是因为当授权筛选器返回结果时,操作筛选器不会运行

要解决此问题,您可以创建自己的
ControllerActionInvoker
子类,并重写
InvokeAction
方法:

public class MyControllerActionInvoker : ControllerActionInvoker
{
    public override bool InvokeAction(ControllerContext controllerContext, string actionName)
    {
        // Your initialization code here
        try
        {
            return base.InvokeAction(controllerContext, actionName);
        }
        finally
        {
            // Your finalization code here
        }
    }
}
您需要将自定义的
MyControllerActionInvoker
类注入到自定义的
ControllerFactory
类中的控制器中:

public class MyControllerFactory : DefaultControllerFactory
{
    private readonly MyControllerActionInvoker actionInvoker = new MyControllerActionInvoker();

    /// <summary>
    /// Retrieves the controller instance for the specified request context and controller type.
    /// </summary>
    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        var controllerInstance = base.GetControllerInstance(requestContext, controllerType);

        if (controllerInstance != null)
        {
            var typedController = controllerInstance as Controller;
            if (typedController != null)
            {
                typedController.ActionInvoker = this.actionInvoker;
            }
        }

        return controllerInstance;
    }
}

此实现在这里工作正常。

授权筛选器检查用户是否有权限,如果没有权限,则没有必要检查其他任何内容。听起来你在做一些奇怪的事情。也许可以解释一下为什么要交换它们。操作过滤器会检查特定用户是否有临时密码,因此我希望在出现“更改密码”页面并显示“未经授权”之前,将其重定向到“更改密码”页面。希望这是有意义的…在这种情况下,听起来你还是希望拥有临时密码的人无法通过授权检查,但如果他们有临时密码,你只想在“未授权”页面中进行检查,然后重定向到“更改密码”页面。或者,您可以在登录时捕获此信息,并在允许他们登录之前强制他们更改密码。那你就不用担心了。
var controllerFactory = new MyControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);