【问题标题】:Specifying action filter at the controller level Versus at the action method level, which will run first在控制器级别指定操作过滤器与在操作方法级别指定操作过滤器,后者将首先运行
【发布时间】:2014-06-19 15:08:02
【问题描述】:

当我创建一个 asp.net MVC 5 web 项目时,我检查了 Account 控制器并找到了以下代码:-

 [Authorize]
    public class AccountController : Controller
    {
        public AccountController()
            : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
        {
        }
        // GET: /Account/Login
        [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

他们在控制器级别指定 [Authorize],在操作方法级别指定 [AllowAnonymous]。我认为 asp.net mvc 将首先检查控制器级别的所有操作过滤器,如果它们成功,它将使用操作方法调用进行处理。但似乎情况并非如此,因为匿名用户可以调用登录操作方法,尽管 [Authorize] 是在控制器级别指定的?那么这里的场景是什么?

谢谢

【问题讨论】:

  • 答案是您方法中的[AllowAnonymous] 将覆盖控制器中的[Authorize]。但是相信我,简单地创建一个新的 mvc 项目并尝试一下会容易得多,因为无论如何你都必须编写代码:)
  • 但这是特定于 [AllowAnonymous] 的,还是总是动作方法的动作过滤器会覆盖控制器的动作过滤器?
  • 这非常依赖。 “覆盖”只是动作过滤器running order 的结果。它基本上是 First -> Global -> Controller -> Action -> Last order,在这种特定情况下,动作级别 [AllowAnonymous] 稍后运行并覆盖控制器级别 [Authorize] 的效果(但两个动作过滤器运行)。您可能需要研究每个过滤器的详细机制,或者如我所说,在需要使用 2 个冲突过滤器时简单地测试它们。
  • 但是两个动作过滤器都运行,然后匿名用户将被重定向到登录页面,在达到 [allowanonymous] 之前..

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5 action-filter


【解决方案1】:

您可以先查看 Authorize 属性源代码以了解其工作原理: http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/AuthorizeAttribute.cs

仔细查看 OnAuthorization 方法:您会看到它在操作或控制器上查找 AllowAnonymous 属性,如果找到则跳过授权。

bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
                                 || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);

if (skipAuthorization)
{
     return;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多