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 实现被截断到最接近的秒数,以便更轻松地进行格式设置。
新行为
ISystemClock、SystemClock 以及具有 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
- 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)