Disable User in ASPNET identity 2.0
When you create a site with the Identity bits installed, your site will have a file called "IdentityModels.cs". In this file is a class called ApplicationUser which inherits from IdentityUser.
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit https://devblogs.microsoft.com/aspnet/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates/ to learn more.
public class ApplicationUser : IdentityUser
There is a nice link in the comments there, for ease click here
This tutorial tells you exactly what you need to do to add custom properties for your user.
And actually, don't even bother looking at the tutorial.
-
add a property to the ApplicationUser class, eg:
public bool? IsEnabled { get; set; }
-
add a column with the same name on the AspNetUsers table in your DB.
-
boom, that's it!
Now in your AccountController, you have a Register action as follows:
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, IsEnabled = true };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
I've added the IsEnabled = true on the creation of the ApplicationUser object. The value will now be persisted in your new column in the AspNetUsers table.
You would then need to deal with checking for this value as part of the sign in process, by overriding PasswordSignInAsync in ApplicationSignInManager.
I did it as follows:
public override Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool rememberMe, bool shouldLockout)
{
var user = UserManager.FindByEmailAsync(userName).Result;
if ((user.IsEnabled.HasValue && !user.IsEnabled.Value) || !user.IsEnabled.HasValue)
{
return Task.FromResult<SignInStatus>(SignInStatus.LockedOut);
}
return base.PasswordSignInAsync(userName, password, rememberMe, shouldLockout);
}
Your mileage may vary, and you may not want to return that SignInStatus, but you get the idea.
The default LockoutEnabled
property for a User
is not the property indicating if a user is currently being locked out or not. It's a property indicating if the user should be subject to lockout or not once the AccessFailedCount
reaches the MaxFailedAccessAttemptsBeforeLockout
value. Even if the user is locked out, its only a temporary measure to bar the user for the duration of LockedoutEnddateUtc
property. So, to permanently disable or suspend a user account, you might want to introduce your own flag property.
You don't need to create a custom property. The trick is to set the
LockoutEnabled
property on the Identity user AND set the LockoutoutEndDateUtc
to a future date from your code to lockout a user. Then, calling the UserManager.IsLockedOutAsync(user.Id
) will return false.
Both the LockoutEnabled
and LockoutoutEndDateUtc
must meet the criteria of true and future date to lockout a user. If, for example, the LockoutoutEndDateUtc
value is 2014-01-01 00:00:00.000
and LockoutEnabled
is true
, calling theUserManager.IsLockedOutAsync(user.Id)
will still return true
. I can see why Microsoft designed it this way so you can set a time span on how long a user is locked out.
However, I would argue that it should be if LockoutEnabled
is true
then user should be locked out if LockoutoutEndDateUtc
is NULL OR a future date. That way you don't have to worry in your code about setting two properties (LockoutoutEndDateUtc
is NULL
by default). You could just set LockoutEnabled
to true
and if LockoutoutEndDateUtc
is NULL
the user is locked out indefinitely.
You would need to introduce your own flag into a custom IdentityUser-derived class and implement/enforce your own logic about enable/disable and preventing the user from logging in if disabled.