2014-10-13 3 views
9

Мы используем класс OAuthAuthorizationServerProvider для авторизации в нашем приложении ASP.NET Web Api.Как настроить сообщение об ошибке OAuthAuthorizationServerProvider?

Если прилагаемая имя пользователя и пароль неверен в GrantResourceOwnerCredentials, вызов

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

Производит следующий JSon результат:

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

Есть ли способ, чтобы настроить этот результат ошибки?
Я хотел бы сделать это в соответствии с форматом сообщения об ошибке по умолчанию, используемые в других частях API:

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

Это можно достичь с помощью OAuthAuthorizationServerProvider?

+1

Хотя приведенные ниже ответы показывают, как это сделать, я хотел бы предостеречь против делать это, как ответ по умолчанию возвращается в соответствии со спецификацией OAuth 2.0, в то время как ваш измененная реакция не будет , Это может быть приемлемо для API только для внутреннего использования. Однако, если этот API общедоступен, вы, вероятно, захотите следовать спецификации и не изобретать новые соглашения. – Chris

+0

Я обнаружил, что эти ответы не работают, и кажется, что ответ OAuth больше похож на стандартный ответ Web 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

В качестве примечания я попытался создать класс OwinMiddleware для переопределения контекста. Response.Body, но это не сработало, если кто-либо попытается. Это сработало отлично. – DDiVita

+1

Это не сработало для меня на веб-сайте api 2. Ответ не был правильным json из-за этой внутренней ошибки, о которой вы говорили. – 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

Смежные вопросы