22

我创建了两个实现AuthorizeAttribute.

一个是全局使用的,我在 Global.asax.cs 上设置:

filters.Add(new FirstAuthorizeAttribute() { Order = 0 });

另一个被调用SecondAuthorizeAttribute,它只在一些动作方法中使用,我将它用作我想要的方法中的属性。

    [HttpGet]
    [SecondAuthorize]
    public ActionResult LogOut()
    {
        FormsAuthentication.SignOut();
        Session.Clear();
        Session.Abandon();
        return Redirect(Url.Content("~/"));
    }

问题是SecondAuthorizeAttribute总是先执行FirstAuthorizeAttribute,我需要先执行这个。订单没有帮助,我该怎么办?

4

3 回答 3

26

@HectorCorrea 的答案中的链接目前已失效,这是从当前 Google 缓存中检索和汇总的内容(以防万一):

过滤器按以下顺序执行:

  • 授权过滤器
  • 动作过滤器
  • 响应/结果过滤器
  • 异常过滤器

在每个过滤器中,您可以指定 Order 属性。(所有过滤器都派生自抽象类FilterAttribute,并且该类具有Order 属性)。此属性将确保过滤器以特定顺序运行。

例如:

[AuthorizationFilterA(Order=2)]
[AuthorizationFilterB(Order=1)]
public ActionResult Index()
{          
    return View();
}

还有FilterScope,默认情况下,当顺序相同(或未指定)时,具有最低范围的过滤器首先运行:

namespace System.Web.Mvc {
    public enum FilterScope {
        First = 0,
        Global = 10,
        Controller = 20,
        Action = 30,
        Last = 100,
    }
}

如果未指定顺序,则顺序值为 -1(第一个,而不是最后一个)。

控制器本身可以是过滤器,并将按顺序运行Int32.MinValue

于 2015-06-08T08:32:47.883 回答
11

这是一个很长的镜头,但是您是否尝试过为 FirstAuthorizeAttribute 使用 Global 和 First 值?

http://msdn.microsoft.com/en-us/library/system.web.mvc.filterscope(v=vs.98).aspx

http://blog.rajsoftware.com/post/2011/05/14/MVC3-Filter-Ordering.aspx

于 2011-10-25T14:21:35.717 回答
3

订单在 global.asax.cs 文件中不起作用。如果要求是命令,则转到控制器或操作方法并给出。前任:-

[secondAttribute(order =1)] [firstAttribute(order=2)]

HomeController:控制器

或者

公共行动结果索引()

于 2013-05-30T11:11:22.697 回答