Comparteix a través de


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.

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