2014-10-13 1 views
9

Stiamo utilizzando la classe OAuthAuthorizationServerProvider per eseguire l'autorizzazione nella nostra app ASP.NET Web Api.Come personalizzare il messaggio di errore di OAuthAuthorizationServerProvider?

Se il nome utente e la password forniti non sono validi nel GrantResourceOwnerCredentials, la chiamata

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

produce il seguente risultato JSON:

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

Esiste un modo per personalizzare il risultato di errore?
Vorrei renderlo coerente con l'errore di default formato del messaggio utilizzato in altre parti del API:

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

Questo è possibile raggiungere con la OAuthAuthorizationServerProvider?

+1

Mentre le risposte qui sotto dimostrano come fare questo, vorrei mettere in guardia contro questo modo, come la risposta predefinita restituita è conforme alle specifiche OAuth 2.0, mentre la risposta modificato non avrebbe . Questo potrebbe essere accettabile per le API solo interne. Tuttavia, se questa API è pubblicamente accessibile, probabilmente si desidera seguire le specifiche e non inventare nuove convenzioni. – Chris

+0

Ho scoperto che queste risposte non funzionano e sembra che la risposta OAuth per sembrare più simile a una risposta API Web standard non è facile come si potrebbe pensare. – Sam

risposta

7

Ecco come l'ho fatto.

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

Come nota avevo provato a creare una classe OwinMiddleware per sovrascrivere il contesto.Response.Body, ma non funzionava neanche se qualcuno ci provava. Questo ha funzionato perfettamente. – DDiVita

+1

Questo non ha funzionato per me su web api 2. La risposta non era corretta, a causa di quel bug interno che hai menzionato. – Sam

5

+1 per la risposta di Dasun. Ecco come l'ho esteso un po 'oltre.

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); 
    } 
} 

Il .ToJsonString() è un altro metodo di estensione che utilizza la libreria Newtonsoft.Json.

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

Usage:

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

Esattamente quello che stavo cercando. Grazie! – vincentw56

+1

Questo non ha funzionato con l'ultima versione di web api 2. – Sam