AutoRefreshTokenHttpMessageHandler 1.1.0
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.1.0
NuGet\Install-Package AutoRefreshTokenHttpMessageHandler -Version 1.1.0
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.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AutoRefreshTokenHttpMessageHandler --version 1.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: AutoRefreshTokenHttpMessageHandler, 1.1.0"
#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.1.0 // Install AutoRefreshTokenHttpMessageHandler as a Cake Tool #tool nuget:?package=AutoRefreshTokenHttpMessageHandler&version=1.1.0
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
, available as Nuget package, 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 | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Microsoft.Bcl.TimeProvider (>= 8.0.1)
- Microsoft.Extensions.Options (>= 8.0.2)
- System.Net.Http.Json (>= 8.0.0)
- System.Text.Json (>= 8.0.2)
-
.NETStandard 2.1
- Microsoft.Bcl.TimeProvider (>= 8.0.1)
- Microsoft.Extensions.Options (>= 8.0.2)
- System.Net.Http.Json (>= 8.0.0)
- System.Text.Json (>= 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.