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.
Ação recomendada
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
- 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)