ISystemClock 已过时

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

引入的版本

ASP.NET Core 8.0 预览版 5

旧行为

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

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

新行为

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

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

TimeProvider 现在是身份验证和标识组件的 Options 类上的可设置属性。 可以直接设置它,也可以通过在依赖关系注入容器中注册提供程序来进行设置。

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

中断性变更的类型

此更改会影响源兼容性。

更改原因

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

如果有派生自 Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions> 的组件,请移除 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