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.
Action recommandée
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
- Microsoft.AspNetCore.Authentication.ISystemClock
- Microsoft.AspNetCore.Authentication.SystemClock
- Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>
- Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>.Clock
- CookieAuthenticationHandler(IOptionsMonitor<CookieAuthenticationOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- FacebookHandler(IOptionsMonitor<FacebookOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- GoogleHandler(IOptionsMonitor<GoogleOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- JwtBearerHandler(IOptionsMonitor<JwtBearerOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- MicrosoftAccountHandler(IOptionsMonitor<MicrosoftAccountOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- NegotiateHandler(IOptionsMonitor<NegotiateOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- OAuthHandler<TOptions>(IOptionsMonitor<TOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- OpenIdConnectHandler(IOptionsMonitor<OpenIdConnectOptions>, ILoggerFactory, HtmlEncoder, UrlEncoder, ISystemClock)
- Microsoft.AspNetCore.Authentication.PolicySchemeHandler.PolicySchemeHandler(IOptionsMonitor<PolicySchemeOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>
- SignInAuthenticationHandler<TOptions>(IOptionsMonitor<TOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- SignOutAuthenticationHandler<TOptions>(IOptionsMonitor<TOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- TwitterHandler(IOptionsMonitor<TwitterOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- WsFederationHandler(IOptionsMonitor<WsFederationOptions>, ILoggerFactory, UrlEncoder, ISystemClock)
- SecurityStampValidator<TUser>(IOptions<SecurityStampValidatorOptions>, SignInManager<TUser>, ISystemClock, ILoggerFactory)
- Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Clock
- TwoFactorSecurityStampValidator<TUser>(IOptions<SecurityStampValidatorOptions>, SignInManager<TUser>, ISystemClock, ILoggerFactory)