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.