Partage via


ISystemClock est obsolète

Microsoft.AspNetCore.Authentication.ISystemClock a été utilisé par les composants d’authentification et d’identité de ASP.NET Core depuis la version 1.0 pour activer le test unitaire des fonctionnalités liées au temps, comme la vérification d’expiration. .NET 8 inclut une abstraction appropriée, System.TimeProvider, qui fournit la même fonctionnalité et bien plus encore. Nous allons profiter de cette occasion pour les ISystemClock obsolètes et les remplacer par des TimeProvider dans les bibliothèques ASP.NET Core.

Version introduite

ASP.NET Core 8.0 Preview 5

Comportement précédent

ISystemClock a été injecté dans les constructeurs des composants d’authentification et d’identité par injection de dépendances (DI) et a pu être remplacé à des fins de test.

L’implémentation par défaut SystemClock a été tronquée à la seconde la plus proche pour faciliter la mise en forme.

Nouveau comportement

ISystemClock, SystemClock, et les constructeurs du gestionnaire d’authentification qui ont un paramètre ISystemClock ont été marqués comme obsolètes. L’utilisation de ces API dans le code généreront un avertissement au moment de la compilation.

ISystemClock reste dans le conteneur d’injection de dépendances, mais n’est plus utilisé. Il peut être supprimé du conteneur dans une version ultérieure.

TimeProvider est désormais une propriété settable sur les classes Options pour les composants d’authentification et d’identité. Il peut être défini directement ou en inscrivant un fournisseur dans le conteneur d’injection de dépendances.

TimeProvider ne tronque pas à la seconde la plus proche. Les consommateurs sont censés mettre en forme correctement l’heure en fonction des besoins.

Type de changement cassant

Ce changement affecte la compatibilité de la source.

Raison du changement

Cette modification a été apportée pour unifier l’abstraction temporelle dans la pile pour faciliter les tests.

Si vous avez des composants qui dérivent de Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions> ou de Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>, supprimez le paramètre de constructeur ISystemClock et appelez le nouveau constructeur de base en conséquence.

- 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)

De même, les implémentations dérivées qui référencent la propriété Clock sur ces types doivent référencer la nouvelle propriété TimeProvider à la place.

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

Vous pouvez définir TimeProvider pour le test sur les options ou via DI.

API affectées