Partilhar via


ISystemClock está obsoleto

Microsoft.AspNetCore.Authentication.ISystemClock tem sido usado pelos componentes de autenticação e identidade do ASP.NET Core desde a versão 1.0 para permitir o teste de unidade de funcionalidade relacionada ao tempo, como verificação de expiração. O .NET 8 inclui uma abstração adequada, System.TimeProviderque fornece a mesma funcionalidade e muito mais. Estamos aproveitando esta oportunidade para obsoletos ISystemClock e substituí-lo por TimeProvider todas as bibliotecas ASP.NET Core.

Versão introduzida

ASP.NET Core 8.0 Preview 5

Comportamento anterior

ISystemClock foi injetado nos construtores dos componentes de autenticação e identidade por injeção de dependência (DI) e pode ser substituído para teste.

A implementação padrão SystemClock truncada para o segundo mais próximo para facilitar a formatação.

Novo comportamento

ISystemClock, SystemClocke os construtores do manipulador de autenticação que têm um ISystemClock parâmetro foram marcados como obsoletos. O uso dessas APIs no código gerará um aviso em tempo de compilação.

ISystemClock permanece no recipiente de injeção de dependência, mas não é mais usado. Ele pode ser removido do contêiner em uma versão futura.

TimeProvider agora é uma propriedade configurável nas Options classes para os componentes de autenticação e identidade. Ele pode ser definido diretamente ou registrando um provedor no contêiner de injeção de dependência.

TimeProvider não truncar para o segundo mais próximo. Espera-se que os consumidores formatem corretamente o tempo conforme necessário.

Tipo de mudança de rutura

Essa alteração afeta a compatibilidade da fonte.

Razão para a alteração

Essa alteração foi feita para unificar a abstração de tempo em toda a pilha para facilitar os testes.

Se você tiver componentes derivados de Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions> ou Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>, remova o parâmetro do ISystemClock construtor e chame o novo construtor base de acordo.

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

Da mesma forma, implementações derivadas que fazem referência à Clock propriedade nesses tipos devem fazer referência à nova TimeProvider propriedade.

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

Você pode definir TimeProvider para teste nas opções ou via DI.

APIs afetadas