ISystemClock 已过时

Microsoft.AspNetCore.Authentication.ISystemClock 自版本 1.0 起,ASP.NET Core 的身份验证和标识组件一直用于对时间相关的功能(例如过期检查)进行单元测试。 .NET 8 包括一个合适的抽象, System.TimeProvider它提供相同的功能和更多功能。 我们将利用此机会在整个 ASP.NET Core 库中将 ISystemClock 废弃,并将其替换为 TimeProvider

已引入的版本

ASP.NET Core 8.0 预览版 5

以前的行为

已通过依赖关系注入 (DI) 将 ISystemClock 注入身份验证和标识组件的构造函数中,并且可以对其进行重写以进行测试。

默认的 SystemClock 实现被截断到最接近的秒数,以便更轻松地进行格式设置。

新行为

ISystemClockSystemClock以及具有 ISystemClock 参数的身份验证处理程序构造函数已标记为已过时。 在代码中使用这些 API 将在编译时生成警告。

ISystemClock 保留在依赖项注入容器中,但不再使用。 将来的版本可能会将其从容器中删除。

TimeProvider 现在是用于身份验证和标识组件的类中的一个可设置属性 Options。 可以直接设置,也可以通过在依赖注入容器中注册服务提供者来进行设置。

TimeProvider 不会截断到最接近的秒数。 使用者应根据需要正确设置时间格式。

破坏性变更的类型

此更改会影响 源兼容性

更改原因

此更改是为了统一堆栈中的时间抽象,以便更轻松地进行测试。

如果您有组件派生自Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>,请删除ISystemClock构造函数参数,并相应地调用新的基类构造函数。

- 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)

同样,引用这些类型的属性的 Clock 派生实现应改为引用新 TimeProvider 属性。

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

可以在选项中或通过 DI 设置 TimeProvider 以进行测试。

受影响的 API