2014-10-13 6 views
9

우리는 ASP.NET Web API 응용 프로그램에서 OAuthAuthorizationServerProvider 클래스를 사용하여 권한을 부여합니다. 제공된 사용자 이름과 암호가 GrantResourceOwnerCredentials에 유효하지 않은 경우OAuthAuthorizationServerProvider의 오류 메시지를 사용자 정의하는 방법은 무엇입니까?

,

context.SetError("invalid_grant", "The user name or password is incorrect."); 

은 다음 JSON 결과를 생성합니다 호출이 오류의 결과를 사용자 정의 할 수있는 방법이

{ 
    "error": "invalid_grant", 
    "error_description": "The user name or password is incorrect." 
} 

거기를?

{ 
    "message": "Some error occurred." 
} 

이이 OAuthAuthorizationServerProvider 달성하는 것이 가능 :
나는 API의 다른 부분에 사용되는 기본 오류 메시지 형식이 일치하도록 하시겠습니까?

+1

아래의 답변이 작업을 수행하는 방법을 보여줍니다 동안 기본 응답은 OAuth는 2.0 사양을 준수를 반환, 나는,이 일에 대해주의에 반해 수정 된 응답은 않을 것 . 이는 내부 전용 API의 경우 허용 될 수 있습니다. 그러나이 API에 공개적으로 액세스 할 수있는 경우 새 규약을 고안하지 않고 사양을 따르기를 원할 것입니다. – Chris

+0

이러한 답변이 작동하지 않으며 OAuth 응답이 표준 웹 API 응답처럼 보이기 쉽다고 생각하는 것만 큼 쉽지 않은 것으로 나타났습니다. – Sam

답변

7

이렇게 해보았습니다.

string jsonString = "{\"message\": \"Some error occurred.\"}"; 

// This is just a work around to overcome an unknown internal bug. 
// In future releases of Owin, you may remove this. 
context.SetError(new string(' ',jsonString.Length-12)); 

context.Response.StatusCode = 400; 
context.Response.Write(jsonString); 
+1

메모로서 나는 context.Response.Body를 오버라이드 (override)하기 위해 OwinMiddleware 클래스를 만들려고했으나 아무도 시도하지 않으면 작동하지 않았다. 이것은 완벽하게 작동했습니다. – DDiVita

+1

이것은 웹 API 2에서 나에게 효과가 없었습니다. 당신이 언급 한 내부 버그로 인해 응답이 적절하지 않았습니다. – Sam

5

+1 다순의 대답입니다. 여기에 제가 조금 더 확장 한 방법이 있습니다.

public class ErrorMessage 
{ 
    public ErrorMessage(string message) 
    { 
     Message = message; 
    } 

    public string Message { get; private set; } 
} 

public static class ContextHelper 
{ 
    public static void SetCustomError(this OAuthGrantResourceOwnerCredentialsContext context, string errorMessage) 
    { 
     var json = new ErrorMessage(errorMessage).ToJsonString(); 

     context.SetError(json); 
     context.Response.Write(json); 
    } 
} 

.ToJsonString()은 Newtonsoft.Json 라이브러리를 사용하는 다른 확장 메서드입니다.

public static string ToJsonString(this object obj) 
    { 
     return JsonConvert.SerializeObject(obj); 
    } 

사용법 :

context.SetCustomError("something went wrong"); 
+0

정확히 내가 무엇을 찾고 있었습니까. 감사! – vincentw56

+1

최신 버전의 web api 2에서이 기능이 작동하지 않습니다. – Sam

관련 문제