ISystemClock está obsoleto

Microsoft.AspNetCore.Authentication.ISystemClock tem sido usado por 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.TimeProviderque fornece a mesma funcionalidade e muito mais. Estamos aproveitando essa oportunidade para tornar obsoleto ISystemClock e substituí-lo em todas as bibliotecas TimeProvider do 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 injeção de dependência (DI) e pode ser substituído durante testes.

A implementação padrão SystemClock é truncada ao segundo mais próximo para formatação facilitada.

Novo comportamento

ISystemClock, SystemClocke os construtores do manipulador de autenticação que têm um ISystemClock parâmetro foram marcados como obsoletos. Usar essas 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 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 trunca para o segundo mais próximo. Espera-se que os consumidores formatem corretamente o tempo conforme necessário.

Tipo de mudança disruptiva

Essa alteração afeta a compatibilidade de origem.

Motivo da 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 que derivam 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 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