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);