Dela via


ISystemClock är föråldrat

Microsoft.AspNetCore.Authentication.ISystemClock har använts av ASP.NET Cores autentiserings- och identitetskomponenter sedan version 1.0 för att aktivera enhetstestning av tidsrelaterade funktioner, till exempel förfallokontroll. .NET 8 innehåller en lämplig abstraktion, System.TimeProvider, som ger samma funktioner och mycket mer. Vi tar tillfället i akt att ersätta ISystemClock den med TimeProvider i ASP.NET Core-biblioteken.

Version introducerad

ASP.NET Core 8.0 Förhandsversion 5

Tidigare beteende

ISystemClock inmatades i konstruktorerna för autentiserings- och identitetskomponenterna genom beroendeinmatning (DI) och kunde åsidosättas för testning.

Standardimplementeringen SystemClock trunkerades till närmaste sekund för enklare formatering.

Nytt beteende

ISystemClock, SystemClockoch konstruktorerna för autentiseringshanterare som har en ISystemClock parameter har markerats som föråldrade. Om du använder dessa API:er i kod genereras en varning vid kompileringstillfället.

ISystemClock finns kvar i containern för beroendeinmatning men används inte längre. Den kan tas bort från containern i en framtida version.

TimeProvider är nu en inställningsbar egenskap för klasserna Options för autentiserings- och identitetskomponenterna. Den kan ställas in direkt eller genom att registrera en provider i containern för beroendeinmatning.

TimeProvider trunkerar inte till närmaste sekund. Konsumenterna förväntas formatera tiden korrekt efter behov.

Typ av icke-bakåtkompatibel ändring

Den här ändringen påverkar källkompatibiliteten.

Orsak till ändringen

Den här ändringen gjordes för att förena tidsabstraktion i stacken för enklare testning.

Om du har komponenter som härleds från Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions> eller Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>tar du bort ISystemClock konstruktorparametern och anropar den nya baskonstruktorn därefter.

- public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
-     : base(options, logger, encoder, clock)
+ public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder)
+     : base(options, logger, encoder)

På samma sätt bör härledda implementeringar som refererar till Clock egenskapen för dessa typer referera till den nya TimeProvider egenskapen i stället.

- var currentUtc = Clock.UtcNow;
+ var currentUtc = TimeProvider.GetUtcNow();

Du kan ställa in TimeProvider för testning av alternativen eller via DI.

Berörda API:er