4

AuthorizeAttribute требует, чтобы вы переопределили метод OnAuthorization, и IAuthorizationFilter требует, чтобы вы реализовали метод OnAuthorization. Для меня это похоже на то, что есть другие различия? Зачем использовать друг друга?В чем разница между использованием AuthorizeAttribute или IAuthorizationFilter?

EDIT: Чтобы уточнить, я пытаюсь понять, в чем разница между следующими двумя частями кода.

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; 
    } 
} 
+1

Если вы заметили, что 'AuthorizeAttribute' реализует' IAuthorizationFilter'. Один - это интерфейс, а другой - класс. – Shoe

+0

@ Спасибо за ваш ответ. Я понимаю, что это интерфейс, а другой - класс (хотя я не заметил, что AuthrozieAttribute реализовал это inteface). Мой вопрос больше связан с реализацией фильтра действий. – thiag0

ответ

3

IAuthorizationFilter только интерфейс. Он ничего не делает. Если вы хотите использовать его, вам придется реализовать свой собственный атрибут авторизации, который реализует этот интерфейс с нуля.

AuthorizeAttribute, с другой стороны, работает из коробки. Он реализует IAuthorizationFilter и уже заботится об общих потребностях разработчиков. Он по-прежнему позволяет переопределить метод OnAuthorization в случае, если вы хотите расширить его функциональность, но вам не нужно, так как он отлично работает, если вы этого не сделаете.

+0

спасибо за ваш ответ. можете ли вы немного рассказать о том, что вы подразумеваете под «работает из коробки»? Если я создаю IAuthorizationFilter и зарегистрирую его через FilterConfig.RegisterGlobalFilters, он все равно будет вызван на каждое действие без необходимости делать что-либо еще. Я редактировал вопрос, чтобы включить некоторые фрагменты кода. – thiag0

+1

В ваших примерах вы создаете новый фильтр авторизации, поэтому я бы пошел с интерфейсом. Вы действительно ничего не получаете, используя AuthorizeAttribute в качестве базового класса в вашем случае. AuthorizeAttribute (http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx) позволяет ограничить доступ на основе пользователей/ролей, не делая собственный фильтр авторизации (вот что я имел в виду из коробки) –

+0

ahhh ok имеет смысл сейчас, вот что я предполагал, что вы имели в виду, но хотел убедиться. Спасибо за помощь. – thiag0

Смежные вопросы