【问题标题】:What is the difference between using AuthorizeAttribute or IAuthorizationFilter?使用 AuthorizeAttribute 或 IAuthorizationFilter 有什么区别?
【发布时间】:2015-01-17 05:54:48
【问题描述】:

AuthorizeAttribute 要求您重写 OnAuthorization 方法,而 IAuthorizationFilter 要求您实现 OnAuthorization 方法。对我来说似乎是同一件事,还有其他区别吗?为什么要使用一个而不是另一个?

编辑: 为了澄清,我试图了解以下两段代码之间的区别。

public class PasswordExpirationCheckAttribute : AuthorizeAttribute
{
    private int _maxPasswordAgeInDays;

    public PasswordExpirationCheckAttribute(int maxPasswordAgeInDays)
    {
        _maxPasswordAgeInDays = maxPasswordAgeInDays;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!filterContext.ActionDescriptor.GetCustomAttributes(typeof(BypassPasswordExpirationCheckAttribute), true).Any())
        {
            IPrincipal userPrincipal = filterContext.RequestContext.HttpContext.User;
            if (userPrincipal != null && userPrincipal.Identity.IsAuthenticated)
            {
                var userStore = new ApplicationUserStore(new IdentityDb());
                var userManager = new ApplicationUserManager(userStore);
                var user = userManager.FindByNameAsync(filterContext.RequestContext.HttpContext.User.Identity.Name).Result;

                if (user != null)
                {
                    var timeSpan = DateTime.Today.Date - user.LastPasswordChangedDate.Date;
                    if (timeSpan.TotalDays >= _maxPasswordAgeInDays)
                    {
                        HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
                        RequestContext requestContext = new RequestContext(httpContextBase, new RouteData());
                        UrlHelper urlHelper = new UrlHelper(requestContext);

                        filterContext.HttpContext.Response.Redirect(urlHelper.Action("ChangePassword", "Manage"));
                    }
                }
            }
        }            

        base.OnAuthorization(filterContext);
    }
}

还有……

public class PasswordExpirationCheckAttribute : IAuthorizationFilter
{
    private int _maxPasswordAgeInDays;

    public PasswordExpirationCheckAttribute(int maxPasswordAgeInDays)
    {
        _maxPasswordAgeInDays = maxPasswordAgeInDays;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!filterContext.ActionDescriptor.GetCustomAttributes(typeof(BypassPasswordExpirationCheckAttribute), true).Any())
        {
            IPrincipal userPrincipal = filterContext.RequestContext.HttpContext.User;
            if (userPrincipal != null && userPrincipal.Identity.IsAuthenticated)
            {
                var userStore = new ApplicationUserStore(new IdentityDb());
                var userManager = new ApplicationUserManager(userStore);
                var user = userManager.FindByNameAsync(filterContext.RequestContext.HttpContext.User.Identity.Name).Result;

                if (user != null)
                {
                    var timeSpan = DateTime.Today.Date - user.LastPasswordChangedDate.Date;
                    if (timeSpan.TotalDays >= _maxPasswordAgeInDays)
                    {
                        HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
                        RequestContext requestContext = new RequestContext(httpContextBase, new RouteData());
                        UrlHelper urlHelper = new UrlHelper(requestContext);

                        filterContext.HttpContext.Response.Redirect(urlHelper.Action("ChangePassword", "Manage"));
                    }
                }
            }
        }            

        return;
    }
}

【问题讨论】:

  • 如果你注意到AuthorizeAttribute 实现了IAuthorizationFilter。一个是接口,另一个是类。
  • @Shoe 感谢您的回复。我知道一个是接口,另一个是类(尽管我忽略了 AuthrozieAttribute 实现了该接口)。我的问题更多是关于动作过滤器的实现。

标签: asp.net-mvc-5 authorize-attribute iauthorizationfilter


【解决方案1】:

IAuthorizationFilter 只是一个接口。它什么也不做。如果您想使用它,您必须实现自己的授权属性,从头开始实现该接口。

另一方面,AuthorizeAttribute 开箱即用。它实现了IAuthorizationFilter,并且已经满足了开发人员的共同需求。它仍然允许您覆盖 OnAuthorization 方法,以防您想扩展其功能,但您不必这样做,因为如果您不这样做,它就可以正常工作。

【讨论】:

  • 感谢您的回复。您能否详细说明“开箱即用”的含义?如果我创建一个 IAuthorizationFilter 并通过 FilterConfig.RegisterGlobalFilters 注册它,它仍然会在每个操作上被调用,而无需执行任何其他操作。我已编辑问题以包含一些代码 sn-ps。
  • 在您的示例中,您正在创建一个全新的授权过滤器,因此我将使用该界面。在您的案例中,使用 AuthorizeAttribute 作为基类并没有真正获得任何收益。 AuthorizeAttribute (msdn.microsoft.com/en-us/library/…) 允许您根据用户/角色限制访问,而无需制作自己的授权过滤器(这就是我的意思)
  • ahhh 好的现在说得通了,这就是我认为你的意思,但想确认一下。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多