4

AuthorizeAttribute를 사용하면 OnAuthorization 메서드를 재정의해야하며 IAuthorizationFilter는 OnAuthorization 메서드를 구현해야합니다. 나에게도 똑같은 것처럼 보입니다. 다른 점이 있습니까? 왜 다른 하나 위에 사용됩니까?AuthorizeAttribute 또는 IAuthorizationFilter를 사용하는 경우의 차이점은 무엇입니까?

편집 : 명확히하기 위해 다음 두 코드 간의 차이점을 이해하려고합니다.

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가 해당 인터페이스를 구현 한 것을 간과했지만). 나의 질문은 액션 필터의 구현과 관련이있다. 귀하의 회신에 감사드립니다 – thiag0

답변

3
IAuthorizationFilter

은 인터페이스이다. 그것은 아무것도하지 않습니다. 이를 사용하려면 해당 인터페이스를 처음부터 구현하는 자체 권한 부여 속성을 구현해야합니다.

AuthorizeAttribute은 기본적으로 작동합니다. 그것은 IAuthorizationFilter을 구현하고 이미 개발자의 일반적인 요구 사항을 처리합니다. 기능을 확장하려는 경우에 대비하여 여전히 OnAuthorization 메서드를 재정의 할 수 있지만 그렇게하지 않아도 정상적으로 작동하므로 필요하지 않습니다.

+0

. 당신은 "상자에서 일하는"것에 의해 당신이 의미하는 바를 정교하게 해석 할 수 있습니까? IAuthorizationFilter를 만들고 FilterConfig.RegisterGlobalFilters를 통해 등록하면 다른 작업을 수행 할 필요없이 모든 작업에 대해 호출됩니다. 몇 가지 코드 스 니펫을 포함하도록 질문을 편집했습니다. – thiag0

+1

예제에서 net-new 권한 부여 필터를 작성 중이므로 인터페이스와 함께 간다. 귀하의 경우 기본 클래스로 AuthorizeAttribute를 사용하여 실제로 아무것도 얻지 못합니다. AuthorizeAttribute (http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx)를 사용하면 사용자/역할을 기반으로 액세스를 제한 할 수 있습니다. 자신의 인증 필터 (그게 내가 상자의 의미였던 것) –

+0

아, 그래, 너는 의미가 있다고 생각했지만 확신하고 싶었어. 도와 주셔서 감사합니다. – thiag0