2013-10-28 40 views
24

當我在asp.net webapi 2中設置OAuth授權服務器時,我如何設置令牌端點接受json而不是表單編碼後?如何設置katana-project以允許json格式的令牌請求?

使用樣本http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

我試圖發送應用/ JSON 與

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

我接收響應 400錯誤的請求

{ 
    "error" : "unsupported_grant_type" 
} 

其中作爲內容類型的應用程序的/ x-www-form-urlencoded and body of grant_type=password&username=Alice&password=password123 按預期工作。

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

通過添加「內容類型:應用程序/ JSON」來請求的標題? – rwisch45

+1

這是我第一次嘗試。我會再試一次,也許我犯了一個錯字。 –

+1

在這個網站上輸了3個小時..谷歌搜索「unsupported_grant_type」引導我到你的帖子來揭示問題。 –

回答

15

根據目前執行的OAuthAuthorizationServerHandler你不能。

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

所以爲了嘗試這一點,你需要提供的OAuthAuthorizationServerMiddleware自己的實現重載CreateHandler,這樣可以提供自己的實現的AuthenticationHandler<OAuthAuthorizationServerOptions>

+0

有關如何在我們自己的OAuthAuthorizationServerMiddleware實現中連線的更多信息?不知何故,我認爲它是'app.UseOAuthBearerAuthentication'。 – Alex

相關問題