Udostępnij przez


ISystemClock jest przestarzały

Microsoft.AspNetCore.Authentication.ISystemClock jest używany przez składniki uwierzytelniania i tożsamości ASP.NET Core od wersji 1.0, aby umożliwić testowanie jednostkowe funkcji związanych z czasem, takich jak sprawdzanie wygaśnięcia. Platforma .NET 8 zawiera odpowiednią abstrakcję , System.TimeProviderktóra udostępnia te same funkcje i wiele innych. Wykorzystujemy tę okazję, aby wycofać ISystemClock z użycia i zastąpić ją TimeProvider w całych bibliotekach ASP.NET Core.

Wersja wprowadzona

ASP.NET Core 8.0 (wersja zapoznawcza 5)

Poprzednie zachowanie

ISystemClock został wstrzyknięty do konstruktorów składników uwierzytelniania i tożsamości poprzez uwstrzykiwanie zależności (DI) i może być nadpisany w celu testowania.

Domyślna SystemClock implementacja skrócona do najbliższej sekundy, aby ułatwić formatowanie.

Nowe zachowanie

ISystemClock, SystemClocki konstruktory programu obsługi uwierzytelniania, które mają ISystemClock parametr, zostały oznaczone jako przestarzałe. Użycie tych interfejsów API w kodzie spowoduje wygenerowanie ostrzeżenia w czasie kompilacji.

ISystemClock pozostaje w kontenerze wstrzykiwania zależności, ale już nie jest używany. Może zostać usunięty z kontenera w przyszłej wersji.

TimeProvider jest teraz ustawialną właściwością w klasach związanych ze składnikami uwierzytelniania i tożsamości. Można go ustawić bezpośrednio lub rejestrując dostawcę w kontenerze wstrzykiwania zależności.

TimeProvider nie jest zaokrąglany do najbliższej sekundy. Użytkownicy powinni poprawnie sformatować czas zgodnie z potrzebami.

Typ zmiany przełamującej

Ta zmiana ma wpływ na zgodność ze źródłem.

Przyczyna zmiany

Ta zmiana została wprowadzona w celu ujednolicenia abstrakcji czasu w stosie w celu ułatwienia testowania.

Jeśli masz składniki pochodzące z Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions> lub Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>, usuń parametr konstruktora ISystemClock i odpowiednio wywołaj nowy konstruktor podstawowy.

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

Podobnie implementacje wywodzące się z tych typów, które odwołują się do właściwości Clock, powinny teraz odnosić się do właściwości TimeProvider.

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

Na potrzeby testowania można ustawić TimeProvider albo za pomocą DI.

Interfejsy API, których dotyczy problem