Compartilhar via


O 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 habilitar o teste de unidade da funcionalidade relacionada ao tempo, como a verificação de expiração. O .NET 8 inclui uma abstração adequada, System.TimeProvider, que fornece a mesma funcionalidade e muito mais. Estamos aproveitando essa oportunidade para tornar ISystemClock obsoleto e substituí-lo por TimeProvider todas as bibliotecas ASP.NET Core.

Versão introduzida

ASP.NET Core 8.0 Versão prévia 5

Comportamento anterior

ISystemClock foi injetado nos construtores dos componentes de autenticação e identidade por DI (injeção de dependência) 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, SystemClock e os construtores do manipulador de autenticação que têm um parâmetro ISystemClock foram marcados como obsoletos. O uso dessas APIs no código gerará um aviso em tempo de compilação.

ISystemClock permanece no contêiner 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 classes Options 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 trunca para o segundo mais próximo. Espera-se que os consumidores formatem corretamente o tempo conforme necessário.

Tipo de alteração interruptiva

Essa alteração afeta a compatibilidade de origem.

Motivo da alteração

Essa alteração foi feita para unificar a abstração de tempo na pilha para facilitar o teste.

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

- 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 à propriedade Clock nesses tipos devem referenciar a nova propriedade TimeProvider.

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

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

APIs afetadas