2013-10-24 2 views
1

AngularJS XSRF 접근 방식과 함께 사용할 사용자 지정 인증 필터를 작성했지만 필터가 호출되지 않았습니다.IAuthorizationFilter의 OnAuthorization 메서드가 호출되지 않습니다.

이상한 점은 다른 프로젝트에서 복사 한 것이고 거기에서 제대로 작동하는 것 같습니다.

여기는 attrubute/filter 코드입니다.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public sealed class ValidateAngularAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter 
    { 
     public void OnAuthorization(AuthorizationContext filterContext) 
     { 
      string token = filterContext.RequestContext.HttpContext.Request.Headers["X-XSRF-TOKEN"]; 
      object sessionToken = filterContext.RequestContext.HttpContext.Session["XSRF-TOKEN"]; 

      if (string.IsNullOrEmpty(token) || sessionToken == null || sessionToken.ToString() != token) 
      { 
       throw new UnauthorizedAccessException(); 
      } 
     } 
    } 

그리고 여기에는 WebAPI 컨트롤러에서 동작이 꾸미고 있습니다.

[Authorize] 
public class WorksOrdersController : ApiController 
{   
    [HttpPost] 
    [ValidateAngularAntiForgeryToken] 
    public void EmailJob(int id, EmailModel model) 
    { 
     // do something 
    } 
} 

Web.config를 작동 시키려면 뭔가를 추가해야합니까? 실제로 작동하는 프로젝트의 web.config에서 전혀 다른 것을 볼 수 없습니다.

+0

권한 부여 특성은 내 경험상 상속 된 클래스가 아닌'AuthorizeAttribute'에서 상속해야합니다. 또한,'OnAuthorize'가 오버라이드 할 수있는 잘못된 함수이기 때문에 HttpContextBase를 인수로 취하는'AuthorizeCore'를 오버라이드해야합니다. –

+0

나는 그 하나의 대안을 생각하지만 나는 AuthorizeAttribute에서 세션에 액세스 할 수 없다. 그렇다고해서 다른 솔루션에서도 같은 코드가 작동하는 이유는 설명하지 않습니다. – BenCr

+0

중요한 세부 사항이 누락되었습니다. ApiController의 작업에 있습니다. – BenCr

답변

5

이제는 ASP.NET에 두 개의 IAuthorizationFilter 인터페이스가 있다는 것이 문제였습니다.

"일반"보기 컨트롤러와 함께 사용하려면 System.Web.Mvc에 하나, WebAPI와 함께 사용하려면 System.Web.Http.Filters에 하나.

나는 작동하지 않는 버전에서 using 문을 잘못 읽었습니다.

1

이 문제의 원인은 두 가지입니다.

첫 번째 - 컨트롤러에 AuthorizeAttribute을 넣었습니다. 컨트롤러 (클래스)와 작업 (메소드)에서 권한 부여를 가지고 있으면 권한 부여에 모두 사용됩니다. 먼저 컨트롤러의 권한 부여 속성이라고합니다. 이 액세스를 허용하면 조치의 권한 부여 속성이라고합니다.

기본 AuthorizeAttribute 사용 Membership하여이 속성이 ACESS를 거부합니다 Membership를 설정하지하고 ValidateAngularAntiForgeryTokenAttribute가 호출되지 않습니다.

컨트롤러 앞에있는 [Authorize] 라인에 주석을 달고 테스트를 실행하십시오. 속성이 지금 호출되는지 확인하십시오.

두 번째 - @siva와 같은 속성으로 변환 해보세요. k는 말했다. like :

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public sealed class ValidateAngularAntiForgeryTokenAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var token = httpContext.Request.RequestContext.HttpContext.Request.Headers["X-XSRF-TOKEN"]; 
     var sessionToken = httpContext.Request.RequestContext.HttpContext.Session["XSRF-TOKEN"]; 

     if (string.IsNullOrEmpty(token) || sessionToken == null || sessionToken.ToString() != token) 
     { 
      return false; 
     } 

     return true; 
    } 
} 
0

Application_Start에서 레지스터 필터 메서드를 호출하는 것을 잊어 버렸기 때문에이 문제가 발생했습니다. 바보 같은 문제이지만 누군가 문제 해결의 날을 저장하면 그만한 가치가 있습니다.

protected void Application_Start(object sender, EventArgs e) 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
} 
관련 문제