799 Stimmen

Festlegen des Autorisierungskopfes des HttpClient

Ich habe einen HttpClient, die ich für eine REST-API verwenden. Ich habe jedoch Probleme beim Einrichten des Authorization-Headers. Ich muss den Header auf das Token setzen, das ich bei meiner OAuth-Anfrage erhalten habe. Ich sah einige Code für .NET, die das folgende vorschlägt,

httpClient.DefaultRequestHeaders.Authorization = new Credential(OAuth.token);

Die Credential-Klasse existiert jedoch nicht in WinRT. Hat jemand eine Idee, wie man den Authorization Header setzt?

50voto

Jourmand Punkte 888

In dem Fall, dass Sie Folgendes senden möchten HttpClient Anfrage mit Bearer Token, kann dieser Code eine gute Lösung sein:

var requestMessage = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    Content = new StringContent(".....", Encoding.UTF8, "application/json"),
    RequestUri = new Uri(".....")
};

requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "Your token");

var response = await _httpClient.SendAsync(requestMessage);

27voto

Alan Ball Punkte 593

Ich habe das Zeichen des Überbringers gesetzt

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

Es funktionierte an einem Endpunkt, aber nicht an einem anderen. Das Problem war, dass ich Kleinbuchstaben hatte b auf "bearer" . Nach der Änderung funktioniert es jetzt für beide Api's die ich treffe. So eine einfache Sache zu verpassen, wenn Sie nicht einmal unter Berücksichtigung es als einer der Heuhaufen für die Nadel zu suchen sind.

Stellen Sie sicher, dass Sie "Bearer" - mit Kapital.

24voto

MohammadSoori Punkte 1744

Verwenden Sie grundlegende Autorisierungs- und Json-Parameter.

using (HttpClient client = new HttpClient())
{
    var request_json = "your json string";

    var content = new StringContent(request_json, Encoding.UTF8, "application/json");

    var authenticationBytes = Encoding.ASCII.GetBytes("YourUsername:YourPassword");

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
            Convert.ToBase64String(authenticationBytes));
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var result = await client.PostAsync("YourURL", content);

    var result_string = await result.Content.ReadAsStringAsync();
}

19voto

Jonas Stensved Punkte 12881

Für alle, die diesen alten Thread jetzt (2021) wiederfinden, schauen Sie bitte unter diese Dokumentation über HttpClientFactory die injizierbar ist und bei jeder Anfrage erneut ausgeführt wird, um abgelaufene Token zu vermeiden, was sie für Inhaber-Token, generierte Clients, Pooling usw. nützlich macht.

TL;DR: Verwendung HttpClientFactory und eine DelegatingHandler die bei allen ausgehenden Anfragen mit Ihrem konfigurierten Client als Middleware fungiert.

So füge ich meinen Inhaber für Azure Identity (von Azure verwaltet) hinzu, aber Sie können das Token natürlich auch nach Belieben erhalten;

using Microsoft.Azure.Services.AppAuthentication;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

public class BearerTokenHandler : DelegatingHandler
    {
        public BearerTokenHandler(AzureServiceTokenProvider tokenProvider, string resource)
        {
            TokenProvider = tokenProvider;
            Resource = resource;
        }

        public AzureServiceTokenProvider TokenProvider { get; }
        public string Resource { get; }

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (!request.Headers.Contains("Authorization"))
            {
                // Fetch your token here
                string token = await TokenProvider.GetAccessTokenAsync(Resource);
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
            }

            return await base.SendAsync(request, cancellationToken);
        }
    }

Ich konfiguriere meine getippten Clients (die mit NSwag generiert wurden) in Startup so;

   var accessTokenProvider = new AzureServiceTokenProvider("<your-connection-string-for-access-token-provider>");

  builder.Services.AddHttpClient<IOrdersClient, OrdersClient>().ConfigureHttpClient(async conf =>
            {
                conf.BaseAddress = new Uri("<your-api-base-url>");
            }).AddHttpMessageHandler(() => new BearerTokenHandler(accessTokenProvider, "https://your-azure-tenant.onmicrosoft.com/api"));

Dann können Sie Ihren IOrdersClient an beliebiger Stelle einfügen und alle Anfragen werden den Überbringer haben.

16voto

emp Punkte 4629

Wenn Sie die HttpClient ist es ratsam, nicht die DefaultRequestHeaders da sie bei jeder Anfrage mitgeschickt werden.

Sie könnten dies versuchen:

var requestMessage = new HttpRequestMessage
    {
        Method = HttpMethod.Post,
        Content = new StringContent("...", Encoding.UTF8, "application/json"),
        RequestUri = new Uri("...")
    };

requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic", 
    Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes($"{user}:{password}")));

var response = await _httpClient.SendAsync(requestMessage);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X