2015-07-15 3 views
5

Ich versuche den OneDrive for Busines in eine Web Form App zu integrieren. Dafür benutze ich die Dokumentation zu dieser uRL angegeben https://dev.onedrive.com/auth/aad_oauth.htm In Web-Formular App ich zwei Seite Zuerst eine haben wird Login-Seite, die eine Schaltfläche für die Anmeldung In-Login-Button klickenOneDrive for Business: "invalid_request", "error_description": "AADSTS90014: Der Anfragetext muss den folgenden Parameter enthalten: 'grant_type

ich erstelle eine GET-Anfrage an Microsoft Onedrive für Business-API mit dem folgenden Code hat

Wenn ich auf den Login-Knopf klicke, bringt es mich zu micorosoft login servie und schickt mich zurück Seite mit Zugangscode callback.aspx (uri auf azur konfiguriert Redirect)

bekam ich den Zugangscode Auf den zweiten Seite i den Zugangscode am Einlösen und eine POST-Anfrage stellt das Authentifizierungstoken Hier bekommen Sie den Code für die zweite Seite.

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

Aber anstelle der Antwort bekomme ich folgenden Fehler. Welche sagen, beinhalten die Grant_type in URL. Ich habe bereits hinzugefügt (Sie können Code einchecken). Ohne dies zu berücksichtigen, bekomme ich denselben Fehler.

Hier ist Fehler

{"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} 

bitte helfen zu wissen, wo, was falsch Geting. Jede Art von Hilfe wird spürbar Vielen Dank im Voraus

+1

dies jemals herausgefunden? Weil ich das gleiche Problem habe, auf den Endpunkt mit Java –

Antwort

5

Sie fügen die Parameter der Anfrage querystring hinzu. Sie müssen die Daten im Anfragetext veröffentlichen.

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

zuzugreifen benutze ich den Pfosten-Mann in Google Chrome, ich werde auch selting Fehler – Sunil

+1

Sunil> Im Pfosten Mann in Google Chrome benötigt: 1) addieren Sie Überschrift " Content-Type: application/x-www-form-urlencoded " 2) entferne dann alle Leerzeichen zwischen den Body-Parametern! – Jarikus

0

Verwendung FormUrlEncodedContent statt StringContent (Formulardaten Post)

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

Was ist falsch mit FormUrlEncodedContent anstelle von StringContent? Sie müssen den Enkodiertyp nicht selbst definieren, und Sie können Schlüsselwertpaare übergeben, anstatt die Zeichenfolgen selbst zu erstellen. – cyptus

Verwandte Themen