diff --git a/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs b/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs index c3304e78f1..18e9b9d87f 100644 --- a/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs +++ b/src/Microsoft.AspNet.Identity.EntityFramework/UserStore.cs @@ -650,7 +650,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework /// /// /// - public virtual Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -668,7 +668,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework /// /// /// - public virtual Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); diff --git a/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs b/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs index 9f4d17f30b..9ccd0a9afd 100644 --- a/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs +++ b/src/Microsoft.AspNet.Identity/IUserLockoutStore.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task GetLockoutEndDateAsync(TUser user, + Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)); /// @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, + Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)); /// diff --git a/src/Microsoft.AspNet.Identity/IdentityUser.cs b/src/Microsoft.AspNet.Identity/IdentityUser.cs index 4fec7e27b1..210791c26f 100644 --- a/src/Microsoft.AspNet.Identity/IdentityUser.cs +++ b/src/Microsoft.AspNet.Identity/IdentityUser.cs @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.Identity /// /// DateTime in UTC when lockout ends, any time in the past is considered not locked out. /// - public virtual DateTimeOffset LockoutEnd { get; set; } + public virtual DateTimeOffset? LockoutEnd { get; set; } /// /// Is lockout enabled for this user diff --git a/src/Microsoft.AspNet.Identity/UserManager.cs b/src/Microsoft.AspNet.Identity/UserManager.cs index bd52e159c0..08ad898aa8 100644 --- a/src/Microsoft.AspNet.Identity/UserManager.cs +++ b/src/Microsoft.AspNet.Identity/UserManager.cs @@ -1786,7 +1786,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task GetLockoutEndDateAsync(TUser user, + public virtual async Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); @@ -1805,7 +1805,7 @@ namespace Microsoft.AspNet.Identity /// /// /// - public virtual async Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, + public virtual async Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { ThrowIfDisposed(); diff --git a/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/InMemoryUserStore.cs b/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/InMemoryUserStore.cs index 0a64f1b07a..e2e9f6e43d 100644 --- a/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/InMemoryUserStore.cs +++ b/test/Microsoft.AspNet.Identity.EntityFramework.InMemory.Test/InMemoryUserStore.cs @@ -535,7 +535,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.InMemory.Test /// /// /// - public virtual Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); @@ -553,7 +553,7 @@ namespace Microsoft.AspNet.Identity.EntityFramework.InMemory.Test /// /// /// - public virtual Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public virtual Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { cancellationToken.ThrowIfCancellationRequested(); ThrowIfDisposed(); diff --git a/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryUserStore.cs b/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryUserStore.cs index 53ff6c8bd7..e056b3f048 100644 --- a/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryUserStore.cs +++ b/test/Microsoft.AspNet.Identity.InMemory.Test/InMemoryUserStore.cs @@ -102,12 +102,12 @@ namespace Microsoft.AspNet.Identity.InMemory Users.FirstOrDefault(u => String.Equals(u.Email, email, StringComparison.OrdinalIgnoreCase))); } - public Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEndDateAsync(TUser user, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(user.LockoutEnd); } - public Task SetLockoutEndDateAsync(TUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { user.LockoutEnd = lockoutEnd; return Task.FromResult(0); diff --git a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs index 879834f320..406efad361 100644 --- a/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Test/UserManagerTest.cs @@ -779,12 +779,12 @@ namespace Microsoft.AspNet.Identity.Test return Task.FromResult(null); } - public Task GetLockoutEndDateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEndDateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { - return Task.FromResult(DateTimeOffset.MinValue); + return Task.FromResult(DateTimeOffset.MinValue); } - public Task SetLockoutEndDateAsync(TestUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEndDateAsync(TestUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(0); } @@ -1045,12 +1045,12 @@ namespace Microsoft.AspNet.Identity.Test throw new NotImplementedException(); } - public Task GetLockoutEndDateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) + public Task GetLockoutEndDateAsync(TestUser user, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } - public Task SetLockoutEndDateAsync(TestUser user, DateTimeOffset lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) + public Task SetLockoutEndDateAsync(TestUser user, DateTimeOffset? lockoutEnd, CancellationToken cancellationToken = default(CancellationToken)) { throw new NotImplementedException(); } diff --git a/test/Shared/UserManagerTestBase.cs b/test/Shared/UserManagerTestBase.cs index 46c31e3f90..66a8cc1c6f 100644 --- a/test/Shared/UserManagerTestBase.cs +++ b/test/Shared/UserManagerTestBase.cs @@ -1449,6 +1449,25 @@ namespace Microsoft.AspNet.Identity.Test Assert.False(await manager.VerifyTwoFactorTokenAsync(user, "Phone", "bogus")); } + [Fact] + public async Task NullableDateTimeOperationTest() + { + var userMgr = CreateManager(); + var user = CreateTestUser(); + user.LockoutEnabled = true; + IdentityResultAssert.IsSuccess(await userMgr.CreateAsync(user)); + + Assert.Null(await userMgr.GetLockoutEndDateAsync(user)); + + // set LockoutDateEndDate to null + await userMgr.SetLockoutEndDateAsync(user, null); + Assert.Null(await userMgr.GetLockoutEndDateAsync(user)); + + // set to a valid value + await userMgr.SetLockoutEndDateAsync(user, DateTimeOffset.Parse("01/01/2014")); + Assert.Equal(DateTimeOffset.Parse("01/01/2014"), await userMgr.GetLockoutEndDateAsync(user)); + } + public List GenerateUsers(string userNamePrefix, int count) { var users = new List(count);