Asp.net mvc 5 ASP.net身份禁用用户

Asp.net mvc 5 ASP.net身份禁用用户,asp.net-mvc-5,asp.net-identity,Asp.net Mvc 5,Asp.net Identity,在MVC5中使用新的ASP.net标识,如何禁用用户登录?我不想删除他们,也许只是禁用他们的帐户一段时间 我在ASPNetUsers表上没有看到状态列或任何内容,有人对此有什么想法吗。UserManager。RemovePasswordAsync(“userId”)将有效禁用用户。如果用户没有密码,他将无法登录。您需要设置新密码才能再次启用该用户。更新:正如CountZero指出的,如果您使用的是v2.1+,那么在尝试下面的解决方案之前,您应该先尝试并使用他们添加的锁定功能。有关完整示例,请参阅

在MVC5中使用新的ASP.net标识,如何禁用用户登录?我不想删除他们,也许只是禁用他们的帐户一段时间


我在ASPNetUsers表上没有看到状态列或任何内容,有人对此有什么想法吗。

UserManager。RemovePasswordAsync(“userId”)
将有效禁用用户。如果用户没有密码,他将无法登录。您需要设置新密码才能再次启用该用户。

更新:正如CountZero指出的,如果您使用的是v2.1+,那么在尝试下面的解决方案之前,您应该先尝试并使用他们添加的锁定功能。有关完整示例,请参阅他们的博客文章:


版本2.0具有可用于锁定用户的IUserLockoutStore接口,但缺点是除了UserManager类公开的传递方法之外,没有OOB功能可以实际利用它。例如,如果作为标准用户名/密码验证过程的一部分,它实际上会增加锁定计数,那就太好了。然而,自己实现是相当琐碎的

步骤#1:创建实现IUserLockoutStore的自定义用户存储

//我在这里指定TKey泛型参数,因为我们对DB键使用int
//您可能需要为您的环境自定义此选项
公共类MyUserStore:IUserLockoutStore
{
//这里是IUserStore实现
公共任务GetLockoutEndDateAsync(MyUser)
{
//..
}
公共任务SetLockoutEndDateAsync(MyUser用户,DateTimeOffset lockoutEnd)
{
//..
}
公共任务IncrementAccessFailedCountAsync(MyUser)
{
//..
}
公共任务ResetAccessFailedCountAsync(MyUser)
{
//..
}
公共任务GetAccessFailedCountAsync(MyUser)
{
//..
}
公共任务GetLockoutEnableAsync(MyUser)
{
//..
}
公共任务SetLockoutEnabledAsync(MyUser用户,启用bool)
{
//..
}
}
步骤#2:在登录/注销操作中使用以下类,而不是UserManager,将自定义用户存储的实例传递给它

public类LockingUserManager:UserManager
托瑟:上课,尤瑟
其中TKey:IEquatable
{
私有只读IUserLockoutStore _userLockoutStore;
公共锁具店经理(Iuser锁具店外店)
:基地(商店)
{
如果(store==null)抛出新的ArgumentNullException(“store”);
_userLockoutStore=store;
}
公共覆盖异步任务FindAsync(字符串用户名、字符串密码)
{
var user=await FindByNameAsync(用户名);
if(user==null)返回null;
var isUserLockedOut=等待GetLockoutEnabled(用户);
如果(isUserLockedOut)返回用户;
var isPasswordValid=等待CheckPasswordAsync(用户,密码);
如果(isPasswordValid)
{
wait\u userLockoutStore.ResetAccessFailedCountAsync(用户);
}
其他的
{
等待递增AccessFailedCount(用户);
user=null;
}
返回用户;
}
私有异步任务GetLockoutEnabled(TUser用户)
{
var isLockoutEnabled=await _userlockoutestore.GetLockoutEnabledAsync(用户);
if(isLockoutEnabled==false)返回false;
var shouldRemoveLockout=DateTime.Now>=await\u userLockoutStore.GetLockoutEndDateAsync(用户);
如果(应移除Velockout)
{
wait\u userLockoutStore.ResetAccessFailedCountAsync(用户);
wait_userLockoutStore.SetLockoutEnabledAsync(user,false);
返回false;
}
返回true;
}
专用异步任务IncrementAccessFailedCount(TUser用户)
{
var accessFailedCount=wait _userLockoutStore.IncrementAccessFailedCountAsync(用户);
var shouldLockoutUser=accessFailedCount>MaxFailedAccessAttemptsBeforeLockout;
如果(应锁定用户)
{
wait_userLockoutStore.SetLockoutEnabledAsync(user,true);
var lockoutEndDate=new DateTimeOffset(DateTime.Now+DefaultAccountLockoutTimeSpan);
wait _userLockoutStore.SetLockoutEndDateAsync(用户,lockoutEndDate);
}
}
}
示例

[AllowAnonymous]
[HttpPost]
公共异步任务登录(字符串用户名、字符串密码)
{
var userManager=new LockingUserManager(new MyUserStore())
{
DefaultAccountLockoutTimeSpan=/*从appSettings获取*/,
MaxFailedAccessAttemptsBeforeLockout=/*从appSettings获取*/
};
var user=await userManager.FindAsync(用户名、密码);
if(user==null)
{
//错误的用户名或密码;请采取适当的操作
}
if(wait_userManager.GetLockoutEnabledAsync(user.Id))
{
//用户已被锁定;请采取适当的操作
}
//用户名和密码都很好
//将用户标记为已验证并重定向到登录后登录登录页面
}

如果要手动锁定某人,可以设置要签入的任何标志
MyUserStore.GetLockoutEnabledAsync()

您可以拥有一个新类,该类应派生自IdentityUser类。您可以在新类中添加一个布尔属性,并可以使用登录过程的每次检查都要注意这个新属性。我也做得很好。我可能想看一看:

我认为结束这个问题是不对的。OP不是在要求代码。问题在于是否可以使用Asp.net identity framework禁用/锁定帐户。在这种情况下,要求OP为他的问题提供一个“尝试性的解决方案”似乎是不合理的,如果他可以的话,他一开始就不必问。我还认为事实上夏娃
await userManager.SetLockoutEnabledAsync(applicationUser.Id, true);
await userManager.SetLockoutEndDateAsync(DateTime.Today.AddYears(10));