From af27c8ab13ef01fbe96cefcd98056b88175d1804 Mon Sep 17 00:00:00 2001 From: StickFun <2000stickfun@gmail.com> Date: Fri, 1 Aug 2025 22:46:24 +0400 Subject: [PATCH 1/2] Added usage of TimeProvider instead of DateTimeOffset --- .../Extensions.Core/src/UserManager.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs index 073b36e9c426..7119921c621d 100644 --- a/src/Identity/Extensions.Core/src/UserManager.cs +++ b/src/Identity/Extensions.Core/src/UserManager.cs @@ -2067,7 +2067,12 @@ public virtual async Task IsLockedOutAsync(TUser user) return false; } var lockoutTime = await store.GetLockoutEndDateAsync(user, CancellationToken).ConfigureAwait(false); - return lockoutTime >= DateTimeOffset.UtcNow; +#if NET8_0_OR_GREATER + var utcNow = UtcNow(); +#else + var utcNow = DateTimeOffset.UtcNow; +#endif + return lockoutTime >= utcNow; } /// @@ -2186,7 +2191,12 @@ public virtual async Task AccessFailedAsync(TUser user) return await UpdateUserAndRecordMetricAsync(user, UserUpdateType.AccessFailed).ConfigureAwait(false); } Logger.LogDebug(LoggerEventIds.UserLockedOut, "User is locked out."); - await store.SetLockoutEndDateAsync(user, DateTimeOffset.UtcNow.Add(Options.Lockout.DefaultLockoutTimeSpan), +#if NET8_0_OR_GREATER + var utcNow = UtcNow(); +#else + var utcNow = DateTimeOffset.UtcNow; +#endif + await store.SetLockoutEndDateAsync(user, utcNow.Add(Options.Lockout.DefaultLockoutTimeSpan), CancellationToken).ConfigureAwait(false); await store.ResetAccessFailedCountAsync(user, CancellationToken).ConfigureAwait(false); return await UpdateUserAndRecordMetricAsync(user, UserUpdateType.AccessFailed).ConfigureAwait(false); @@ -2679,6 +2689,14 @@ protected virtual void Dispose(bool disposing) } } +#if NET8_0_OR_GREATER + private DateTimeOffset UtcNow() + { + var timeProvider = ServiceProvider.GetService(); + return timeProvider?.GetUtcNow() ?? DateTimeOffset.UtcNow; + } +#endif + private IUserTwoFactorStore GetUserTwoFactorStore() { var cast = Store as IUserTwoFactorStore; From a1d7d2ab0e23f47f3220e2d8e76ac106bd66f33d Mon Sep 17 00:00:00 2001 From: StickFun <2000stickfun@gmail.com> Date: Sat, 2 Aug 2025 11:48:42 +0400 Subject: [PATCH 2/2] Changed UtcNow implementation --- .../Extensions.Core/src/UserManager.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs index 7119921c621d..0e430b8cf75c 100644 --- a/src/Identity/Extensions.Core/src/UserManager.cs +++ b/src/Identity/Extensions.Core/src/UserManager.cs @@ -2067,12 +2067,7 @@ public virtual async Task IsLockedOutAsync(TUser user) return false; } var lockoutTime = await store.GetLockoutEndDateAsync(user, CancellationToken).ConfigureAwait(false); -#if NET8_0_OR_GREATER - var utcNow = UtcNow(); -#else - var utcNow = DateTimeOffset.UtcNow; -#endif - return lockoutTime >= utcNow; + return lockoutTime >= UtcNow(); } /// @@ -2191,12 +2186,7 @@ public virtual async Task AccessFailedAsync(TUser user) return await UpdateUserAndRecordMetricAsync(user, UserUpdateType.AccessFailed).ConfigureAwait(false); } Logger.LogDebug(LoggerEventIds.UserLockedOut, "User is locked out."); -#if NET8_0_OR_GREATER - var utcNow = UtcNow(); -#else - var utcNow = DateTimeOffset.UtcNow; -#endif - await store.SetLockoutEndDateAsync(user, utcNow.Add(Options.Lockout.DefaultLockoutTimeSpan), + await store.SetLockoutEndDateAsync(user, UtcNow().Add(Options.Lockout.DefaultLockoutTimeSpan), CancellationToken).ConfigureAwait(false); await store.ResetAccessFailedCountAsync(user, CancellationToken).ConfigureAwait(false); return await UpdateUserAndRecordMetricAsync(user, UserUpdateType.AccessFailed).ConfigureAwait(false); @@ -2695,6 +2685,11 @@ private DateTimeOffset UtcNow() var timeProvider = ServiceProvider.GetService(); return timeProvider?.GetUtcNow() ?? DateTimeOffset.UtcNow; } +#else + private static DateTimeOffset UtcNow() + { + return DateTimeOffset.UtcNow; + } #endif private IUserTwoFactorStore GetUserTwoFactorStore()