webentwicklung-frage-antwort-db.com.de

Hinzufügen von Berechtigungen zu den Kopfzeilen

Ich habe folgenden Code:

...
AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue("OAuth2", Contract.AccessToken);
string result = await PostRequest.AuthenticatedGetData(fullUrl, null, authHeaders);
return result; 
...

public static async Task<string> AuthenticatedGetData(string url, FormUrlEncodedContent data, AuthenticationHeaderValue authValue)
{

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authValue.Parameter);

    HttpResponseMessage response = await client.PostAsync(new Uri(url), data);

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();
    return responseBody;
}

Der Teil response = await setzt nur eine fortlaufende Schleife fort und nichts passiert. Irgendwelche Ideen, was ich falsch mache?

Die Frage ist wirklich, wie sende ich den folgenden Header:

Authorization: OAuth2 ACCESS_TOKEN

auf eine externe Web-API

22
Jimmyt1988

Diese Linie

client.DefaultRequestHeaders.Authorization = 
           new AuthenticationHeaderValue(authValue.Parameter);

Erzeugt diesen Header-Wert

Authorization: ACCESS_TOKEN

Wo ACCESS_TOKEN ist der Wert von authValue.Parameter. Sie möchten stattdessen den übergebenen Wert zuweisen, um den erforderlichen Header zu erhalten

client.DefaultRequestHeaders.Authorization = authValue;

Wird herstellen

Authorization: OAuth2 ACCESS_TOKEN
21
Alaa Masoud

Ich kämpfte damit. Es wurde immer wieder die Fehlermeldung "Ungültiges Format" angezeigt, da ich eine benutzerdefinierte Implementierung habe und der Authorization-Header anhand bestimmter Standards überprüft wurde. Das Hinzufügen des Headers auf diese Weise hat jedoch funktioniert:

var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
55
John

Hatte ein ähnliches Problem, als AuthenticationHeaderValue mit meinen Anforderungen arbeitete. Ich habe auch JWT JsonWebToken von GitHub verwendet. Ich konnte ein Token von der API erhalten, hatte jedoch Schwierigkeiten, es in anderen GETs und POSTs zu verwenden.

var jwt = JsonWebToken.Encode(token, APISECRET, JwtHashAlgorithm.HS256);
var tk = GetTokenFromApi(); // basically returns an encrypted string.

Manuelles Verwenden von WebRequest: Was gut funktioniert hat.

request.ContentType = "application/json";
request.Method = "POST";
request.Headers.Set("Authorization", string.Format("Bearer {0}", tk));

Als wir zu einem HttpClient wechselten und den AuthenticationHeaderValue verwendeten, konnten wir nicht herausfinden, wie er korrekt eingerichtet wurde. Nachdem ich mir die Anforderungszeichenfolge angesehen hatte, sah ich, dass die "Autorisierung" für mich hinzugefügt wurde. Mit Parametern rumgespielt, und das hat endlich geklappt.

 var authenticationHeaderValue = new AuthenticationHeaderValue("Bearer", tk);
6
Yogurt The Wise

Vielleicht interessant für andere Leute. Da habe ich lange danach gesucht. Sie müssen Ihre Cookies aber auch speichern und bei Ihrer nächsten Anfrage angeben. Zuerst habe ich meinen Authentifizierungscode erhalten und meine Cookies in einer statischen Variablen gespeichert (beim ersten Aufruf dieser Methode gebe ich dem Token einen leeren Wert).

    public static CookieContainer CookieContainer;
    public static async Task<string> Post<TRequest>( TRequest requestBody, string path, string token = "")
    {
        var baseUrl = new Uri($"urlFromApi");
        CookieContainer = new CookieContainer();
        using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
            using(var client = new HttpClient(handler){BaseAddress = baseUrl})
        {
            client.DefaultRequestHeaders.ConnectionClose = false;
            if (!string.IsNullOrWhiteSpace(token))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            }
            ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute            using (var content = new ByteArrayContent(GetByteData(requestBody)))
            using (var content = new ByteArrayContent(GetByteData(requestBody)))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                var response = await client.PostAsync(String.Empty, content);
                return await GetResponseContent(response);
            }
        }

    }

Wenn ich danach eine Anfrage an die API mache, füge ich die Cookies hinzu (Token ist das, was Sie von der ersten Antwort als Ergebnis erhalten). Public static async Task Get (Zeichenfolgenpfad, Zeichenfolgentoken = "") {

        var baseUrl = $"https://innoviris-ai.collibra.com/rest/2.0{path}";
        using (var handler = new HttpClientHandler() { CookieContainer = CookieContainer })
        using (var client = new HttpClient(handler) {BaseAddress = new Uri(baseUrl)})
        {
            client.DefaultRequestHeaders.ConnectionClose = false;
            if (!string.IsNullOrWhiteSpace(token))
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", $"{token}");
            }
            ServicePointManager.FindServicePoint(client.BaseAddress).ConnectionLeaseTimeout = 60 * 1000; //1 minute     

            var response = await client.GetAsync(String.Empty);
            return await GetResponseContent(response);
        }
    }
2
Nico