2013-10-28 9 views
24

Quando configuro un server di autorizzazione OAuth in asp.net webapi 2, come posso impostare l'endpoint del token per accettare json piuttosto che un post codificato del modulo?Come si imposta katana-project per consentire le richieste di token in formato json?

Utilizzando il campione http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

ho provato a mandare application/json con

{ 
"grant_type":"password", 
"username":"Alice", 
"password":"password123" 
} 

ricevo la risposta 400 Richiesta

{ 
    "error" : "unsupported_grant_type" 
} 

dove come un tipo di contenuto di applicazione/x-www-form-urlencoded e corpo di grant_type=password&username=Alice&password=password123 funziona come previsto.

200 OK

{ 
    "access_token" : "08cQ33ZG728AqBcj1PBsRSs4iBPc02lLCZfpaRRWLx2mH_wpQzMwGDKS7r7VgJiKUjUFaq6Xv0uguINoiB_evVbVOtvyWaqAYvc0HRjlgrbj12uQqFbUB7bgH-jiyfhumkwuTSTVHfKUhBjCuD_pbyxEbu2K5WSJpUVge_SGxnb-htm4ZNf1qKDmpEnP9IpZVeJa-KnV0m0gEmP04slMW_JrO390LzCNvXZwVk1yMNuvDakk8tWX7Y6WkFoh7vtW6xfhw3QMbmnvS6px70yMWcTksRNG2bdmi4SenhuRTJx8IsCMnz-4Co7KiCNJGF7KLeU4WzE-LSqXv3mQ30CIQ7faXoMn53p83wZ1NoXYyhsNrQD4POUns_Isb_Pax5gvpZEdyo8zr1r7wb0dS7UXvJb0PWzLHc57Pg3u0kmcizQ", 
    "token_type" : "bearer", 
    "expires_in" : 1209599, 
    "userName" : "Alice", 
    ".issued" : "Wed, 30 Oct 2013 15:16:33 GMT", 
    ".expires" : "Wed, 13 Nov 2013 15:16:33 GMT" 
} 
+0

Con l'aggiunta di "Content-Type: application/json" per l'intestazione della richiesta? – rwisch45

+1

Questo è quello che ho provato prima. Ci riproverò, forse ho fatto un refuso. –

+1

Perso 3 ore in questo .. googling "unsupported_grant_type" mi ha portato al tuo post per rivelare il problema. –

risposta

15

Sulla base della attuale implementazione di OAuthAuthorizationServerHandler non si può.

private async Task InvokeTokenEndpointAsync() 
{ 
    DateTimeOffset currentUtc = Options.SystemClock.UtcNow; 
    // remove milliseconds in case they don't round-trip 
    currentUtc = currentUtc.Subtract(TimeSpan.FromMilliseconds(currentUtc.Millisecond)); 

    IFormCollection form = await Request.ReadFormAsync(); 
    var clientContext = new OAuthValidateClientAuthenticationContext(
       Context, 
       Options, 
       form); 

    await Options.Provider.ValidateClientAuthentication(clientContext); 

    if (!clientContext.IsValidated) 
    { 
      _logger.WriteError("clientID is not valid."); 
      if (!clientContext.HasError) 
      { 
       clientContext.SetError(Constants.Errors.InvalidClient); 
      } 
      await SendErrorAsJsonAsync(clientContext); 
      return; 
     } 

     var tokenEndpointRequest = new TokenEndpointRequest(form); 
} 

Quindi, al fine di tentare questo è necessario fornire la propria implementazione di OAuthAuthorizationServerMiddleware che sovraccarica CreateHandler in modo da poter fornire la propria implementazione di AuthenticationHandler<OAuthAuthorizationServerOptions>

+0

ulteriori informazioni su come collegare nella nostra implementazione di OAuthAuthorizationServerMiddleware? penso che sia in qualche modo con "app.UseOAuthBearerAuthentication"? – Alex

Problemi correlati