当我创建一个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],在action方法级别指定[AllowAnonymous]。我认为asp.net mvc将首先检查控制器级别的所有动作过滤器,如果它们成功,它将使用action方法调用进行处理。但似乎这不是情况,因为匿名用户可以调用登录操作方法,虽然在控制器级别指定了[Authorize]?那么这里的情景是什么?
由于
答案 0 :(得分:3)
您可以首先查看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;
}