ISystemClock está obsoleto
Los componentes de autenticación e identidad de ASP.NET Core han utilizado Microsoft.AspNetCore.Authentication.ISystemClock desde la versión 1.0 para habilitar pruebas unitarias de función relacionada con el tiempo, como la comprobación de expiración. .NET 8 incluye una abstracción adecuada, System.TimeProvider, que proporciona la misma función y mucho más. Estamos aprovechando esta oportunidad para establecer ISystemClock como obsoleto y reemplazarlo por TimeProvider en todas las bibliotecas de ASP.NET Core.
Versión introducida
ASP.NET Core 8.0 (versión preliminar 5)
Comportamiento anterior
ISystemClock se insertó en los constructores de los componentes de autenticación e identidad insertando dependencias (DI) y se podría invalidar para las pruebas.
La implementación predeterminada SystemClock se trunca en el segundo más cercano para facilitar el formato.
Comportamiento nuevo
ISystemClock, SystemClock y los constructores del controlador de autenticación que tienen un parámetro ISystemClock se han marcado como obsoletos. El uso de estas API en el código generará una advertencia en tiempo de compilación.
ISystemClock permanece en el contenedor de inserción de dependencias, pero ya no se usa. Puede quitarse del contenedor en una versión futura.
TimeProvider ahora es una propiedad que se puede establecer en las clases Options
para los componentes de autenticación e identidad. Se puede establecer directamente o bien registrando un proveedor en el contenedor de inserción de dependencias.
TimeProvider no se trunca en el segundo más cercano. Se espera que los consumidores apliquen el formato correcto a la hora según sea necesario.
Tipo de cambio importante
Este cambio afecta a la compatibilidad de origen.
Motivo del cambio
Este cambio se realizó para unificar la abstracción de tiempo en la pila a fin de facilitar las pruebas.
Acción recomendada
Si tiene componentes que derivan de Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions> o Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>, quite el parámetro ISystemClock del constructor y llame al nuevo constructor base según corresponda.
- 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)
De igual modo, las implementaciones derivadas que hacen referencia a la propiedad Clock
en estos tipos deben hacer referencia a la nueva propiedad TimeProvider
en su lugar.
- var currentUtc = Clock.UtcNow;
+ var currentUtc = TimeProvider.GetUtcNow();
Puede establecer TimeProvider
para realizar pruebas en las opciones o mediante la inserción de dependencias.
API afectadas
- 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)