首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASPNET标识2.0中禁用用户

在ASPNET标识2.0中禁用用户
EN

Stack Overflow用户
提问于 2014-03-26 05:19:17
回答 9查看 50.5K关注 0票数 46

我正在寻找一种方法来禁用用户,而不是删除他们从系统,这是保持数据完整性的相关数据。但似乎ASPNET的身份只提供删除的记账。

有一个新的锁定功能,但它似乎可以控制锁定,以禁用用户,但只有在一定数量的不正确的密码尝试锁定用户。

还有其他选择吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-02-10 09:01:22

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

代码语言:javascript
复制
// 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

在注释中有一个很好的链接,为了方便地单击这里

本教程将向您详细介绍为用户添加自定义属性所需做的工作。

实际上,甚至不用看教程。

  1. 向ApplicationUser类添加一个属性,例如: 公共嘘声?IsEnabled { get;set;}
  2. 在DB中的AspNetUsers表上添加一个名称相同的列。
  3. 砰,就这样!

现在,在您的AccountController中,您有了一个寄存器操作,如下所示:

代码语言:javascript
复制
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)

我在创建IsEnabled对象时添加了ApplicationUser = true。该值现在将持久化到AspNetUsers表中的新列中。

然后,您需要通过在PasswordSignInAsync中重写ApplicationSignInManager来处理该值的检查,将其作为进程中符号的一部分。

我是这样做的:

代码语言:javascript
复制
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);
    }

您的里程可能会有所不同,您可能不想返回那个SignInStatus,但是您知道了。

票数 80
EN

Stack Overflow用户

发布于 2014-05-14 03:53:13

LockoutEnabled的默认User属性不是指示用户当前是否被锁定的属性。它是一个属性,指示一旦AccessFailedCount到达MaxFailedAccessAttemptsBeforeLockout值,用户是否应该处于锁定状态。即使用户被锁在门外,它也只是在LockedoutEnddateUtc属性期间禁止用户使用的唯一临时措施。因此,要永久禁用或挂起用户帐户,您可能需要引入自己的标志属性。

票数 27
EN

Stack Overflow用户

发布于 2014-05-01 14:05:28

您不需要创建自定义属性。诀窍是在标识用户上设置LockoutEnabled属性,并将LockoutoutEndDateUtc设置为代码中的未来日期,以锁定用户。然后,调用UserManager.IsLockedOutAsync(user.Id)将返回false。

LockoutEnabledLockoutoutEndDateUtc都必须满足锁定用户的真日期和未来日期的标准。例如,如果LockoutoutEndDateUtc值为2014-01-01 00:00:00.000,而LockoutEnabledtrue,则调用UserManager.IsLockedOutAsync(user.Id)仍将返回true。我能理解为什么微软会这样设计它,这样你就可以设定一个用户被锁在外面的时间跨度。

但是,我认为如果LockoutEnabledtrue,那么如果LockoutoutEndDateUtc为NULL或将来的日期,用户就应该被排除在外。这样,您就不必在代码中担心设置两个属性(默认情况下,LockoutoutEndDateUtcNULL )。您只需将LockoutEnabled设置为true,如果LockoutoutEndDateUtcNULL,则用户将被无限期地锁定在外。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22652118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档