2012-12-13 2 views
3

기본적으로 ServiceStack은 권한 부여 전에 아무 것도 호출하지 않으면 http 상태 401을 반환합니다. 대신 http 상태 200과 내 DTO를 어떻게 반환합니까?ServiceStack에서 HTTP 401 응답을 변경하는 방법은 무엇입니까?

무언가를 무단 호출하려고하면 이상적으로 ResponseStatus 응용 프로그램에 부울 NeedAuth = true 플래그를 표시하고 싶습니다.

답변

0

나는 이전에 작성한 사용자 정의 AuthProvider를 수정했습니다. 내가 AuthResponse 확장 한

{ 
    "NeedAuth": true 
} 

:

public class MyAuthResponse : AuthResponse 
{ 
    public bool? NeedAuth { get; set; } 
} 

그리고 내 사용자 지정으로 AuthProvider를 수정 지금은 인증 전에 아무것도 전화를 걸거나 잘못된 자격 증명을 제공하려고하면, 나는 HTTP 200 개 OK 상태 및이 응답을 얻을 CredentialsAuthProvider에서 상속 :

// This one is called when I call anything before authorization 
public override void OnFailedAuthentication(IAuthSession session, ServiceStack.ServiceHost.IHttpRequest httpReq, ServiceStack.ServiceHost.IHttpResponse httpRes) 
{ 
    httpRes.StatusCode = (int)HttpStatusCode.OK; 
    var callback = httpReq.GetJsonpCallback(); 
    var doJsonp = EndpointHost.Config.AllowJsonpRequests && !string.IsNullOrEmpty(callback); 
    var res = new MyAuthResponse() { NeedAuth = true }; 
    if (doJsonp) 
     httpRes.WriteToResponse(httpReq, res, (callback + "(").ToUtf8Bytes(), ")".ToUtf8Bytes()); 
    else 
     httpRes.WriteToResponse(httpReq, res); 
} 

// This one is called when I try to login 
public override object Authenticate(IServiceBase authService, IAuthSession session, Auth request) 
{ 
    var userName = request.UserName; 
    var password = request.Password; 
    var res = new MyAuthResponse(); 

    if (!LoginMatchesSession(session, userName)) 
    { 
     authService.RemoveSession(); 
     session = authService.GetSession(); 
    } 

    if (TryAuthenticate(authService, userName, password)) 
    { 
     if (session.UserAuthName == null) 
      session.UserAuthName = userName; 

     OnAuthenticated(authService, session, null, null); 

     res.UserName = userName; 
     res.SessionId = session.Id; 
    } 
    else 
     res.NeedAuth = true; 

    return res; 
} 
1

401은 응답에 기록되며 현재 실행 취소 할 방법이 없습니다. 특별한 요구 사항이있는 경우 기본 제공 인증 기능을 사용하지 않으려 고합니다.

당신이 원하는 것을 정확히 수행하는 고유 한 요청 필터를 만드십시오. 이것이 바로 기본 제공 Auth가 작동하는 방법입니다. 요청 필터 일뿐입니다.

+0

좀 더 구체적으로 기본 인증 동작을 무시하기 위해 무엇을 변경해야합니까? 내장 기능을 재정의하는 가장 깨끗한 방법은 무엇입니까? – Savvkin

+0

나는 ServiceStack의 인증을 사용하지 않고 자신 만의 인증을 제공한다고 말하고 있습니다. SS Auth Providers는 ServiceStack에서 분리되며 Request Filters로 생성되므로 쉽게 동일하게 수행 할 수 있습니다. – mythz

관련 문제