如何在Identity 2.0中禁用用户?

Cav*_*man 7 c# asp.net asp.net-identity asp.net-identity-2

我试图找到一种方法来禁用Identity 2.0中的用户,似乎无法找到任何信息.

我想基本上将用户设置为IsActive = false,并且希望在创建用户后立即执行此操作.但是,我需要一种方法来为我们的网站管理员设置IsActive.我已经拥有ASP.Net会员资格,但我希望将网站转换为MVC和身份.

根据我的要求,我们要求人们继续注册帐户,但我们希望默认情况下禁用它.然后,当我们收到加入付款时,我们将返回并启用它们.我们还使用它来禁用用户订阅时,他们没有续订.

有没有办法在不删除帐户的情况下禁用帐户或仅将其锁定X段时间?到目前为止,我还没有找到任何方法只是在Identity中禁用用户,我很惊讶这个问题以前没有出现过.

ozz*_*ozz 13

当您创建一个安装了标识位的站点时,您的站点将有一个名为"IdentityModels.cs"的文件.在此文件中有一个名为ApplicationUser的类,它继承自IdentityUser.

// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
Run Code Online (Sandbox Code Playgroud)

这里的评论中有一个很好的链接,为了方便点击这里

本教程将准确告诉您为用户添加自定义属性需要执行的操作.

实际上,甚至不用费心去看教程.

1)向ApplicationUser类添加属性,例如:

public bool? IsEnabled { get; set; }
Run Code Online (Sandbox Code Playgroud)

2)在数据库的AspNetUsers表中添加一个具有相同名称的列.

3)热潮,就是这样!

现在在您的AccountController中,您有一个Register操作,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

我在创建ApplicationUser对象时添加了IsEnabled = true.该值现在将保留在AspNetUsers表的新列中.

然后,您需要通过覆盖ApplicationSignInManager中的PasswordSignInAsync来处理检查此值作为登录过程的一部分.

我做了如下:

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);
    }
Run Code Online (Sandbox Code Playgroud)

您的里程可能会有所不同,您可能不想退回SignInStatus,但您明白了.

  • 您如何在 ASP.NET Core 1.0 中使用没有 ApplicationSignInManager 或 PasswordSignInAsync(...) 的 Identity 3.0 实现相同的功能? (2认同)
  • 最大的问题是如果他们已经登录,它不会影响他们.特别是如果他们选中了Remember Me复选框.如果他们定期访问该站点,他们将永远不需要登录.我正在试图找出是否可以使用现有的锁定逻辑,以及它是否更好地处理已经登录的用户. (2认同)

TKh*_*ili 5

正在对此进行一些研究,结果证明IdentityUser基类有一些与此主题相关的属性.即:LockoutEnabledLockoutEndDateUtc.

设置LockoutEnabledtrueLockoutEndDateUtc未来某个日期就足够了,以便标准SignInManager.PasswordSignInAsync可以在没有任何覆盖或自定义的情况下进行相应的操作.

如果您只想禁用用户而不指定任何确切的重新激活日期,您可以将其设置为DateTime.MaxValue.