2016-06-21 16 views
1

Unser Kunde hatte eine Anforderung, ihre API in die Website zu integrieren, die wir für sie entwickeln. Und die API-Authentifizierung erfolgt über oAuth 2.0. Sie haben alle notwendigen Informationen (Client ID, Client Secret, Token Uri usw.) zur Verfügung gestellt.oAuth 2.0 API-Verbrauch über C#

Allerdings haben wir Schwierigkeiten, das Code-Snippet zu verstehen, um es über C# aufzurufen. Wir wissen, dass wir ein Anforderungs-Token anfordern und dieses an den Header für die nachfolgenden Anfragen anhängen müssen. Wir haben versucht, DotNetOpenAuth und Owin, aber nicht den tatsächlichen Code zu finden, um dies zu implementieren/war bisher nicht gelungen. Kann mir jemand mit einem kleinen Stück C# -Code helfen, dies zu erreichen?

Antwort

3

Um das Zugriffstoken anzufordern, müssen Sie nur eine Anfrage stellen und die Authentifizierungsdaten posten. Dieser Code wurde aus einer funktionierenden MVC-App mit dem Berechtigungsnachweis des Ressourceneigentümer-Passworts extrahiert:

Ich hoffe, es hilft.

EDIT

Hier haben Sie einen Code-Schnipsel Auffrischen den Token:

using (var client = new HttpClient()) 
{ 
    var postData = new List<KeyValuePair<string, string>>(); 
    postData.Add(new KeyValuePair<string, string>("refresh_token", _refreshToken)); 
    postData.Add(new KeyValuePair<string, string>("grant_type", "refresh_token")); 
    postData.Add(new KeyValuePair<string, string>("client_id", _clientId)); 
    postData.Add(new KeyValuePair<string, string>("client_secret", _clientSecret)); 

    HttpContent content = new FormUrlEncodedContent(postData); 
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 

    var responseResult = client.PostAsync(_tokenUrl, content).Result; 

    return responseResult.Content.ReadAsStringAsync().Result; 
} 

und deren Verwendung:

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken); 
    HttpResponseMessage result = client.GetAsync(_url).Result; 

    if (result.StatusCode == HttpStatusCode.Unauthorized) 
    { 
     RefreshToken(); /* Or reenter resource owner credentials if refresh token is not implemented */ 
     if (/* token refreshed, repeat the request using the new access token */) 
     { 
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _newAccessToken); 

      result = client.GetAsync(_url).Result; 

      if (result.StatusCode == HttpStatusCode.Unauthorized) 
      { 
       // Process the error 
      } 
     } 
    } 

    return result; 
} 
+0

Dank! Es scheint, dass ich jetzt das Token abrufen kann (mit ein wenig Modifikation wie Hinzufügen von "Scope" usw.). Eine letzte Frage, bevor ich dies als Antwort markieren kann. Das Anfügen des Tokens mit nachfolgenden Anforderungen funktioniert also gut. Allerdings fragen wir uns, ob jedes Mal ein Token generiert werden sollte oder ob C# das gleiche Token bis zum Ablauf des Tokens übernimmt und erst wieder generiert, wenn es abgelaufen ist. Was ist der bessere Weg, das zu tun? Jedes Codebeispiel wird geschätzt! –

+1

Sie müssen dasselbe Token anhängen, bis Sie 401 - Nicht autorisierte Antwort erhalten. Dann müssen Sie ein neues Zugriffstoken erhalten, unabhängig davon, ob Sie die Anmeldeinformationen des Ressourceneigners posten oder ein Aktualisierungstoken verwenden. Die Aktualisierungstoken-Gewährungsanforderung ähnelt der Anmeldeinformation, ist jedoch für den Benutzer transparent, sodass die Anmeldeinformationen nicht erneut eingegeben werden müssen. Bitte beachten Sie die bearbeitete Antwort mit dem neuen Code-Snippet. – jumuro

+0

Danke. Ich habe damit herumgespielt. Also ich verstehe, wir müssen den Schlüssel pro Sitzung generieren und während der Sitzung, wenn der Schlüssel abgelaufen ist, werden wir das Token aktualisieren. Das bedeutet auch, wenn der Benutzer den Browser schließt und später wiederkommt, wird das Token generiert, wenn er die API benutzt. Ist das korrekt? –

Verwandte Themen