2017-12-13 1 views
0

MVC4/Razor에서 사용자 정의 권한 부여 특성을 만들고 사용자 정의 권한 부여 특성에서 "AllowAnnoymous"특성을 실행하는 데 문제가 있습니다 (무시하는 것으로 보입니다). 컨트롤러 나 동작에 익명 특성 허용 여부가 포함되어 있는지 확인한 다음 통과 할 수 있는지 확인하여 솔루션 (아래 참조)을 찾았으므로 괜찮습니다.CustomAuthorizeAttribute - AuthorizationContext 대신 HttpActionContext

그러나 "AuthorizeAttribute"클래스를 만들고 "OnAuthorization"오버라이드를 구현하려고 할 때 객체 처리기를 "AuthorizationContext"유형으로 설정하지만 아래 예제와 다른 많은 경우에는 ' 여기에 "AuthorizationContext"가 사용되어서는 안되는 대신 "HttpActionContext"여야합니다. 비록 내가 "HttpActionContext"로 대체하려고 시도했지만, 오버라이드는 적절한 메소드가 없다는 것을 말하는데 실패한다. 제가 누락/잘못하고있는 것에 대한 아이디어가 있습니까?

Example Found Here (By Jammer)

private static bool SkipAuthorization(HttpActionContext actionContext) 
{ 
    Contract.Assert(actionContext != null); 

    return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any() 
       || actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any(); 
} 

public override void OnAuthorization(HttpActionContext actionContext) 
{ 
     base.OnAuthorization(actionContext); 
} 

내 코드

private override void OnAuthorization(AuthorizationContext filterContext) // Not sure how to change this to HttpActionContext 
{ 
    if (filterContext == null) throw new ArugmentException("filterContext"); 
    if (!AllowAnnonymous(new HttpActionContext())) 
    { 
     throw new HttpResponseException(HttpStatusCode.UnAuthorized); 
    } 
    else 
    { 
     base.OnAuthorization(filterContext); 
    } 
} 

답변

1

저는 누락 된 것에 대한 모든 아이디어/잘못하고?

먼저 MVC System.Web.Mvc.AuthorizeAttribute 대신 Web API System.Web.Http.AuthorizeAttribute을 사용하는 예를 살펴 보겠습니다. MVC와 웹 API는 별도의 프레임 워크이며 둘 다 다른 특성을 인식하지 못합니다. 또한 AuthorizeAttribute에 다른 컨텍스트 유형이있는 이유이기도합니다. 당신은 (출력 캐싱을 다루는 다른 중요한 논리와 함께) OnAuthorization에서 해당 검사를 수행하는 논리를 무시하기 때문에

둘째, AllowAnonymousAttribute를 인식하지 못하는 이유는 사용자 정의 AuthorizeAttribute입니다. 대신 AuthorizeCore을 무시하고 true/false를 반환하면이 중요한 로직을 건너 뛰지 않습니다.

사용자가 리디렉션되는 위치를 변경해야 할 경우 승인이 실패 할 때만 실행되는 HandleUnauthorizedRequest을 무시할 수 있습니다.

마지막으로 자신의 특성을 검사하기 위해 ActionDescriptor에 액세스해야하는 경우 OnAuthorizationAuthorizationContext.ActionDescriptor을 통해 전달됩니다. 불행하게도 자동으로 AuthorizeCore으로 전달되지 않지만 HttpContext.ItemsOnAuthorizationthis example으로 설정하면이 문제를 해결할 수 있습니다.

+0

음 - 확실히 설명해줍니다. WebAPI가 MVC와 별개의 것을 사용한다는 것을 깨닫지 못했습니다. 이 시나리오 대 MVC의 System.Web.Http.AuthorizeAttribute를 사용할 수 있습니까? 또한 "AuthorizeCore"재정의를 확인합니다. 익명 속성을 사용할 수 있기를 바랄 것입니다 (사물을 따지지 않고). 진심으로 설명에 감사드립니다! –

+0

'이 시나리오 대 MVC의 System.Web.Http.AuthorizeAttribute를 사용할 수 있습니까? '아니요,하지만 왜 그렇게하고 싶은지 불분명합니다. 그들 사이에 비지니스 로직을 공유하고 싶다면'System.Web.Mvc.IAuthorizationFilter'와'System.Web.Http.IAuthorizationFilter'를 모두 구현하는 하나의 클래스를 생성하거나, 주입되는 공통 서비스를 만들 수 있습니다 AuthorizeAttribute와 함께 DI를 사용하는 방법에 대한 정보는 [이 답변] (https://stackoverflow.com/a/32254851/)을 참조하십시오. – NightOwl888

+0

흥미 롭군요 - 제공된 링크/설명을 사용하여 테스트 한 결과이 기능이 저에게 효과가 있다고 생각합니다. 도와 주셔서 감사합니다! –

관련 문제