asp.net-mvc-5 – ASP.net身份禁用用户
发布时间:2020-12-16 00:39:52 所属栏目:asp.Net 来源:网络整理
导读:在MVC 5中使用新的ASP.net身份,我们如何禁止用户登录?我不想删除它们,也许只是在一段时间内禁用他们的帐户。 有没有人有任何想法,因为我没有看到一个状态列或ASP.NETUsers表上的任何东西。 解决方法 更新:正如CountZero指出的,如果您使用的是v2.1,那
在MVC 5中使用新的ASP.net身份,我们如何禁止用户登录?我不想删除它们,也许只是在一段时间内禁用他们的帐户。
有没有人有任何想法,因为我没有看到一个状态列或ASP.NETUsers表上的任何东西。 解决方法
更新:正如CountZero指出的,如果您使用的是v2.1,那么您应该尝试使用先前添加的锁定功能,然后再尝试下面的解决方案。查看他们的博客文章一个完整的例子:
http://blogs.msdn.com/b/webdev/archive/2014/08/05/announcing-rtm-of-asp-net-identity-2-1-0.aspx
版本2.0具有可用于锁定用户的IUserLockoutStore接口,但不利之处在于,没有OOB功能可以超越UserManager类公开的直通方法来实际利用它。例如,如果实际上将锁定计数作为标准用户名/密码验证过程的一部分实际增加将是很好的。但是,实现自己是相当微不足道的。 步骤1:创建实现IUserLockoutStore的自定义用户存储。 // I'm specifying the TKey generic param here since we use int's for our DB keys // you may need to customize this for your environment public class MyUserStore : IUserLockoutStore<MyUser,int> { // IUserStore implementation here public Task<DateTimeOffset> GetLockoutEndDateAsync(MyUser user) { //.. } public Task SetLockoutEndDateAsync(MyUser user,DateTimeOffset lockoutEnd) { //.. } public Task<int> IncrementAccessFailedCountAsync(MyUser user) { //.. } public Task ResetAccessFailedCountAsync(MyUser user) { //.. } public Task<int> GetAccessFailedCountAsync(MyUser user) { //.. } public Task<bool> GetLockoutEnabledAsync(MyUser user) { //.. } public Task SetLockoutEnabledAsync(MyUser user,bool enabled) { //.. } } 步骤2:代替UserManager,在登录/注销操作中使用以下类,传递自定义用户存储的实例。 public class LockingUserManager<TUser,TKey> : UserManager<TUser,TKey> where TUser : class,IUser<TKey> where TKey : IEquatable<TKey> { private readonly IUserLockoutStore<TUser,TKey> _userLockoutStore; public LockingUserManager(IUserLockoutStore<TUser,TKey> store) : base(store) { if (store == null) throw new ArgumentNullException("store"); _userLockoutStore = store; } public override async Task<TUser> FindAsync(string userName,string password) { var user = await FindByNameAsync(userName); if (user == null) return null; var isUserLockedOut = await GetLockoutEnabled(user); if (isUserLockedOut) return user; var isPasswordValid = await CheckPasswordAsync(user,password); if (isPasswordValid) { await _userLockoutStore.ResetAccessFailedCountAsync(user); } else { await IncrementAccessFailedCount(user); user = null; } return user; } private async Task<bool> GetLockoutEnabled(TUser user) { var isLockoutEnabled = await _userLockoutStore.GetLockoutEnabledAsync(user); if (isLockoutEnabled == false) return false; var shouldRemoveLockout = DateTime.Now >= await _userLockoutStore.GetLockoutEndDateAsync(user); if (shouldRemoveLockout) { await _userLockoutStore.ResetAccessFailedCountAsync(user); await _userLockoutStore.SetLockoutEnabledAsync(user,false); return false; } return true; } private async Task IncrementAccessFailedCount(TUser user) { var accessFailedCount = await _userLockoutStore.IncrementAccessFailedCountAsync(user); var shouldLockoutUser = accessFailedCount > MaxFailedAccessAttemptsBeforeLockout; if (shouldLockoutUser) { await _userLockoutStore.SetLockoutEnabledAsync(user,true); var lockoutEndDate = new DateTimeOffset(DateTime.Now + DefaultAccountLockoutTimeSpan); await _userLockoutStore.SetLockoutEndDateAsync(user,lockoutEndDate); } } } 例: [AllowAnonymous] [HttpPost] public async Task<ActionResult> Login(string userName,string password) { var userManager = new LockingUserManager<MyUser,int>(new MyUserStore()) { DefaultAccountLockoutTimeSpan = /* get from appSettings */,MaxFailedAccessAttemptsBeforeLockout = /* get from appSettings */ }; var user = await userManager.FindAsync(userName,password); if (user == null) { // bad username or password; take appropriate action } if (await _userManager.GetLockoutEnabledAsync(user.Id)) { // user is locked out; take appropriate action } // username and password are good // mark user as authenticated and redirect to post-login landing page } 如果你想手动锁定一个人,你可以设置你在MyUserStore.GetLockoutEnabledAsync()中检查的任何标志。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net – 如何对缓存层进行单元测试
- asp.net – .NET Developer的Vagrant文??件(具有Windows,II
- asp.net-mvc-3 – Editor用于收集我的模型中的项目
- asp-classic – 在经典ASP中本地化记录集中的日期
- ASP.NET vNext如何处理config.json中的缓存,压缩和MimeMap?
- asp.net-web-api – 在Web Api / Owin架构中,处理“/ token
- asp.net – 为每个网站/应用程序创建单独的IIS应用程序池的
- asp.net-mvc – 属性似乎根本不起作用
- asp.net-mvc-routing – ASP.NET Web Api路由(IIS vs Self
- 将TagHelpers嵌套在ASP.NET Core MVC 6中
推荐文章
站长推荐
- asp.net-mvc-4 – 将ninject dependecyResolver用
- asp.net-mvc – 如何测试ASP MVC应用程序以获得基
- asp.net-mvc-2 – User.Identity数据来自哪里?
- 为ASP.NET应用程序实现后台服务的最佳方法是什么
- asp.net – 什么是asp:textbox.MaxLength默认值
- ASP.net Model View Presenter是否值得时间?
- 使用ASP.NET流视频
- asp.net-mvc – MVC不引人注目的范围验证动态值
- asp.net-mvc-3 – 如何添加一个锚标签到我的URL?
- asp.net – System.Linq.Dynamic不支持OrderByDe
热点阅读