asp.net-mvc-5 – ASP.net身份禁用用户
发布时间:2020-05-25 03:06:20 所属栏目: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中使用JSON和JQuery从WebMethod返回DataTable
- asp.net-mvc-3 – 从JsonResult MVC3 / Razor中动态显示表/
- asp.net – .NET Web API HttpResponseMessage模式?
- 什么是Asp.net中的中等信任?
- kendo-ui – 剑道网格刷新(数据绑定两次)
- asp.net – 什么是错误代码是0x80070001?那我该怎么解决呢
- ASP.NET C#5异步Web应用程序使用异步和等待
- asp.net-mvc – 如何改变jslint(VS 2010扩展)忽略文件?
- asp.net-mvc – Asp.Net MVC捆绑,最好的方式来检测丢失的文
- asp.net – 无法加载viewstate.正在加载viewstate的控制树必
推荐文章
站长推荐
- 使用ASP.NET WebApi中的HttpClient异步读取分块内
- asp.net-mvc – 域实体,DTO和查看模型
- .net – vNext是完全“基于约定的编程”吗?
- Asp.net下使用Jquery Ajax传送和接收DataTable的
- asp.net-core – 在ASP.NET vNext过滤器中获取注
- asp.net-mvc – Visual Studio提示使用Razor语法
- asp.net – JObject.Parse与JsonConvert.Deseria
- asp.net-mvc – 在VS 2012中创建和运行MVC 5项目
- 如何获得干净的ASP.Net错误页面?
- asp.net-mvc-3 – Orchard CMS DataAnnotations
热点阅读
