Store 没有实现 IUserLockoutStore<TUser>
Store does not implement IUserLockoutStore<TUser>
我正在尝试为 asp.net Identity 2.0 实现自己的 DAL,并提供我需要的功能。我不需要帐户锁定功能。但是当我尝试调用
var result = await SignInManager.PasswordSignInAsync(model.Login, model.Password, model.RememberMe, shouldLockout: false);
我得到System.NotSupportedException:Store does not implement IUserLockoutStore<TUser>.
那么,如果我不需要 IUserLockoutStore,为什么还要实现它呢?
看到这个答案:When implementing your own IUserStore, are the "optional" interfaces on the class actually optional?
您将需要欺骗或重写您尝试在商店中调用的方法,以实现不使用 "optional" 锁定商店的方法。
您可能会惊讶地发现您还需要为双因素实现 "optional" 接口。使用下面相同的答案来这样做,除非你有双因素的方法。
首先,这里是默认实现:
public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
...
if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture())
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
{
return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
}
...
return SignInStatus.Failure;
}
一个答案:创建无用的商店。
#region LockoutStore
public Task<int> GetAccessFailedCountAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task<bool> GetLockoutEnabledAsync(MyUser user)
{
return Task.Factory.StartNew<bool>(() => false);
}
public Task<DateTimeOffset> GetLockoutEndDateAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task<int> IncrementAccessFailedCountAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task ResetAccessFailedCountAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task SetLockoutEnabledAsync(MyUser user, bool enabled)
{
throw new NotImplementedException();
}
public Task SetLockoutEndDateAsync(MyUser user, DateTimeOffset lockoutEnd)
{
throw new NotImplementedException();
}
#endregion
}
另一个解决方案:重写以不使用它。
public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
...
if (false)
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
{
return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
}
...
return SignInStatus.Failure;
}
我正在尝试为 asp.net Identity 2.0 实现自己的 DAL,并提供我需要的功能。我不需要帐户锁定功能。但是当我尝试调用
var result = await SignInManager.PasswordSignInAsync(model.Login, model.Password, model.RememberMe, shouldLockout: false);
我得到System.NotSupportedException:Store does not implement IUserLockoutStore<TUser>.
那么,如果我不需要 IUserLockoutStore,为什么还要实现它呢?
看到这个答案:When implementing your own IUserStore, are the "optional" interfaces on the class actually optional?
您将需要欺骗或重写您尝试在商店中调用的方法,以实现不使用 "optional" 锁定商店的方法。
您可能会惊讶地发现您还需要为双因素实现 "optional" 接口。使用下面相同的答案来这样做,除非你有双因素的方法。
首先,这里是默认实现:
public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
...
if (await UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture())
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
{
return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
}
...
return SignInStatus.Failure;
}
一个答案:创建无用的商店。
#region LockoutStore
public Task<int> GetAccessFailedCountAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task<bool> GetLockoutEnabledAsync(MyUser user)
{
return Task.Factory.StartNew<bool>(() => false);
}
public Task<DateTimeOffset> GetLockoutEndDateAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task<int> IncrementAccessFailedCountAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task ResetAccessFailedCountAsync(MyUser user)
{
throw new NotImplementedException();
}
public Task SetLockoutEnabledAsync(MyUser user, bool enabled)
{
throw new NotImplementedException();
}
public Task SetLockoutEndDateAsync(MyUser user, DateTimeOffset lockoutEnd)
{
throw new NotImplementedException();
}
#endregion
}
另一个解决方案:重写以不使用它。
public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
...
if (false)
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPasswordAsync(user, password).WithCurrentCulture())
{
return await SignInOrTwoFactor(user, isPersistent).WithCurrentCulture();
}
...
return SignInStatus.Failure;
}