AutoRefreshTokenHttpMessageHandler 1.0.0-beta
This is a prerelease version of AutoRefreshTokenHttpMessageHandler.
There is a newer version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package AutoRefreshTokenHttpMessageHandler --version 1.0.0-beta
NuGet\Install-Package AutoRefreshTokenHttpMessageHandler -Version 1.0.0-beta
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AutoRefreshTokenHttpMessageHandler" Version="1.0.0-beta" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AutoRefreshTokenHttpMessageHandler --version 1.0.0-beta
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: AutoRefreshTokenHttpMessageHandler, 1.0.0-beta"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install AutoRefreshTokenHttpMessageHandler as a Cake Addin #addin nuget:?package=AutoRefreshTokenHttpMessageHandler&version=1.0.0-beta&prerelease // Install AutoRefreshTokenHttpMessageHandler as a Cake Tool #tool nuget:?package=AutoRefreshTokenHttpMessageHandler&version=1.0.0-beta&prerelease
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
AutoRefreshTokenHttpMessageHandler
This is a thread-safe implementation of a DelegatingHandler
that automatically refreshes the access token when the access token expires whilst not serializing all requests. Most implementations use a lock internally which essentially makes all async actions synchronous again. This implementation only blocks during the actual refresh. Inspired by Bryan Helms' Thread-Safe Auth Token Store Using ConcurrentDictionary and AsyncLazy.
Quickstart
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<TokenOptions>(configuration.GetRequiredSection("MyClient"))
.AddTransient<TokenDelegatingHandler>()
.AddHttpClient<ITokenAuthenticationService, TokenAuthenticationService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://auth.myservice.com")).Services
Custom service:
builder.Services.AddHttpClient<MyService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://myservice.com"))
.AddHttpMessageHandler<TokenDelegatingHandler>();
public class MyService(HttpClient client)
{
public Task<IEnumerable<MyFoo>> GetFoos() => client.GetFromJsonAsync<IEnumerable<Foo>>("/api/v1/foos");
}
...or using Refit:
// ...or Refit:
builder.Services.AddRefitClient<IMyService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://myservice.com"))
.AddHttpMessageHandler<TokenDelegatingHandler>();
public interface IMyService
{
[Get("/api/v1/foos")]
Task<IEnumerable<Foo>> GetFooss();
}
Adding Polly to the mix:
builder.Services.AddHttpClient<MyService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("http://myservice.com"))
.AddHttpMessageHandler<TokenDelegatingHandler>();
.AddPolicyHandler(HttpPolicyExtensions
.HandleTransientHttpError()
.WaitAndRetryAsync(Backoff.DecorrelatedJitterBackoffV2(TimeSpan.FromSeconds(1), 3))
).Services
Add options to appsettings:
Client credentials:
{
"MyClient": {
"ClientId": "myclient",
"ClientSecret": "clientsecretclientsecretclientsecret",
"TokenEndpoint": "http://auth.myservice.com/realms/myapi/protocol/openid-connect/token"
}
}
...or using username/password:
{
"MyClient": {
"ClientId": "myclient",
"ClientSecret": "clientsecretclientsecretclientsecret",
"Username": "admin",
"Password": "mysup3rs4f3p455w0rd",
"TokenEndpoint": "http://auth.myservice.com/realms/myapi/protocol/openid-connect/token"
}
}
Attribution
Icon by Freepik
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net8.0
- Microsoft.Extensions.Options (>= 8.0.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.