2015-07-15 13 views
5

Sto cercando di integrare OneDrive for Busines in un'app Web Form. Per questo sto usando la documentazione data a questo indirizzo https://dev.onedrive.com/auth/aad_oauth.htm Nel web Modulo App ho due pagina primo è pagina di login, che dispone di un pulsante per il login In pulsante di accesso clicca sto facendo una richiesta GET a Microsoft Onedrive for business API utilizzando il seguente codiceOneDrive for Business: "invalid_request", "error_description": "AADSTS90014: il corpo della richiesta deve contenere il seguente parametro: 'grant_type

HttpClient client = new HttpClient(); 
      Redirecturi = Uri.EscapeDataString(Redirecturi); 
      string url = string.Format("https://login.windows.net/common/oauth2/authorize?response_type=code&client_id={0}&redirect_uri={1}", ClienId, Redirecturi); 
      var response = client.GetAsync(url); 
      var json = response.Result.Content.ReadAsStringAsync(); 
      Label2.Text = json.Result; 

Quando faccio clic sul pulsante di accesso mi sta portando a micorosoft login servie e mi sta inviando a callback.aspx pagina con il codice di accesso (Redirect URI configurato su Azure)

ho ottenuto il codice di accesso Nella seconda pagina sto riscattando il codice di accesso e fare una richiesta POST per ottenere il token di autenticazione ecco il codice per la seconda pagina.

private string BaseUri="https://login.windows.net/common/oauth2/token"; 
    public string Redirecturi = "http://localhost:51642/CallBack.aspx"; 
    public string ResourcesId = "https://api.office.com/discovery/"; 
    private string ClienId = "180c6ac4-5829-468e-.....-822405804862"; ///truncated//azure 
    private string ClientSecert = "G4TAQzD8d7C4...OE6m366afv8XKbTCcyXr4=";//truncated 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!string.IsNullOrEmpty(Request.QueryString[OAuthConstants.AccessToken])) 
     { 
      // There is a token available already. It should be the token flow. Ignore it. 
      return; 
     } 
     if (!string.IsNullOrEmpty(Request.QueryString[OAuthConstants.Code])) 
     { 
      string _accessCode = Request.QueryString[OAuthConstants.Code]; 
      HttpClient client = new HttpClient(); 
      // BaseUri = Uri.EscapeDataString(BaseUri); 
      Redirecturi = Uri.EscapeDataString(Redirecturi); 
      ResourcesId = Uri.EscapeDataString(ResourcesId); 
      string url = string.Format("{0}?client_id={1}&redirect_uri={2}&grant_type=authorization_code&client_secret={3}&code={4}&grant_type=authorization_code&resource={5}", BaseUri, ClienId, Redirecturi, ClientSecert, _accessCode, ResourcesId); 
      var response = client.PostAsync(url, null); 
      var json = response.Result.Content.ReadAsStringAsync(); 
      Response.Write(json); 
     } 
    } 

Ma invece di risposta sto ottenendo l'errore seguente. Quale dice include il grant_type in url. Ho già aggiunto (puoi controllare il codice). Senza includere anche questo sto ricevendo lo stesso errore.

Ecco errore

{"error":"invalid_request","error_description":"AADSTS90014: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: 2adb3a7f-ceb1-4978-97c4-3dc2d3cc3ad4\r\nCorrelation ID: 29fb11a0-c602-4891-9299-b0b538d75b5f\r\nTimestamp: 2015-07-15 09:58:42Z","error_codes":[90014],"timestamp":"2015-07-15 09:58:42Z","trace_id":"2adb3a7f-ceb1-4978-97c4-3dc2d3cc3ad4","correlation_id":"29fb11a0-c602-4891-9299-b0b538d75b5f","submit_url":null,"context":null} 

per favore aiutatemi a sapere dove, cosa geting sbagliato. Qualsiasi tipo di aiuto sarà apprezzabile Grazie mille in anticipo

+1

mai capito questo? Perché sto avendo lo stesso problema cercando di accedere all'endpoint usando Java –

risposta

5

Si aggiungono i parametri alla richiesta querystring. Devi inviare i dati nel corpo della richiesta.

var content = new StringContent(
       "grant_type=authorization_code" + 
       "&client_id=" + ClienId + 
       "&redirect_uri=" + Redirecturi + 
       "&client_secret=" + ClientSecert + 
       "&code=" + _accessCode + 
       "&resource=" + ResourcesId, 
       Encoding.UTF8, 
       "application/x-www-form-urlencoded"); 

var response = httpClient.PostAsync(BaseUri, content); 

var result = response.Result.Content.ReadAsStringAsync(); 
+0

Sto usando il Post Man in Google Chrome, sto anche ricevendo lo stesso errore – Sunil

+1

Sunil> Nel post Man in Google Chrome necessario: 1) aggiungi intestazione " Content-Type: application/x-www-form-urlencoded " 2) quindi rimuovi tutti gli spazi tra i parametri del corpo! – Jarikus

0

uso FormUrlEncodedContent invece di StringContent (data post forma)

var formContent = new FormUrlEncodedContent(new Dictionary<string, string> 
{ 
    { "client_id", clientId }, 
    { "client_secret", clientSecret }, 
    { "code", authCode }, 
    { "redirect_uri", redirectUri }, 
    { "grant_type", "authorization_code" } 
}); 

var response = await httpClient.PostAsync("https://login.microsoftonline.com/common/oauth2/token", formContent); 
+0

Cosa c'è di sbagliato in FormUrlEncodedContent invece di StringContent? Non è necessario definire da sé il tipo di enconding e si è in grado di passare coppie di valori chiave invece di conciliare le stringhe da soli. – cyptus