【发布时间】: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