2014-09-30 2 views
4

나는 WebAPI에 대한 클라이언트의 요청을 인증하기 위해 BasicAuthenticationHandler를 사용하는 사용자에게BasicAuthenticationMiddleware을 만들 수 있습니다.는 OWIN 인증 및 사용자 정의 응답

BasicAuthenticationHandler는> 기본 클래스 AuthenticationHandler를 < TOptions로부터 도출한다.

모든 것이 잘 작동하고 나는 논리가 인증하는

AuthenticateCoreAsync 가 인증되지 않은 요청의 경우 논리는, WWW 인증 헤더를 전송

ApplyChallengeResponseAsync 을 어떻게 구현 클라이언트에게. 대신

처럼 표준 메시지의

{ 
Code="999", 
Description="My failing reason" 
AdditionalInfo = "My additional infos" 
} 

: 지금 달성하고 싶은 무엇

같은 사용자 정의 개체의 ApplyChallengeResponseAsync 내부의 응답 (IOwinResponse에 사용자 정의 몸을 설정하는 것입니다

{ 
    message="Authorization has been denied for this request." 
} 

는이에 대한 어떤 제안?

감사가 있었나요

답변

7

표시되는 표준 메시지 (이 요청에 대해 권한이 거부되었습니다)는 Authorize 필터에 의해 만들어집니다. HandleUnauthorizedRequest 메서드는이 메시지를 응답으로 설정합니다.

protected virtual void HandleUnauthorizedRequest(HttpActionContext actionContext) 
{ 
    if (actionContext == null) 
    { 
     throw Error.ArgumentNull("actionContext"); 
    } 

    actionContext.Response = actionContext.ControllerContext.Request 
           .CreateErrorResponse(
            HttpStatusCode.Unauthorized, 
             SRResources.RequestNotAuthorized); 
} 

SRResources.RequestNotAuthorized은 표준 메시지로 보는 것입니다.

이제는 Katana 인증 마이크로 프레임 워크의 OnSendingHeaders 콜백에서 ApplyChallengeResponseAsync이 호출됩니다. 이 콜백은 구성 요소가 응답 스트림에 쓸 때 호출됩니다. 우리의 경우, 필터에 의해 생성 된 응답 메시지 (위의 내용)가 직렬화되면 콜백이 호출되고 ApplyChallengeResponseAsync이 실행됩니다. 그때까지 이미 응답을 변경하기에는 너무 늦었습니다. 가장 좋은 방법은 위의 Authorize 필터의 가상 메서드를 재정의하는 것입니다. 대신, 제어기 또는 동작 방법에 [Authorize]를 사용

public class MyAuthorizeAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     var response = actionContext.Request.CreateResponse<MyError> 
           (new MyError() { Description = "My failing reason" }); 
     response.StatusCode = HttpStatusCode.Unauthorized; 

     actionContext.Response = response; 
    } 
} 

public class MyError 
{ 
    public string Description { get; set; } 
} 

, [MyAuthorize]를 사용한다.

+0

감사합니다. 그것은 간단했지만 나는 그것을 놓쳤다. –