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