【问题标题】:Adding soft delete to Identity users table向身份用户表添加软删除
【发布时间】:2015-08-08 03:34:29
【问题描述】:

我已经在我的 Users 表中添加了一个已删除的 at 列,但显然由 Identity 框架提供的注册新用户方法仍然会在数据库中看到这些用户,有没有办法告诉它忽略某个列?

注册

// this needs to ignore any DeletedAt where not null
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
    ...
}

登录

// this needs to ignore any DeletedAt where not null
result = await SignInManager.PasswordSignInAsync( user.UserName, model.Password, model.RememberMe, shouldLockout: true );

...任何其他正在进行的外部登录事情都需要被告知该专栏。

【问题讨论】:

  • 登录:你想检查用户是否“被删除”而不让他登录?关于注册有什么问题?
  • 只继承 SignInManager 并添加检查 IsDeleted
  • tmg - 我不希望允许已删除用户登录的登录方法.../谢谢 trailmax

标签: c# entity-framework asp.net-mvc-5 asp.net-identity-2


【解决方案1】:

在您的signInManager 中覆盖SignInAsync 方法,此方法用于每个登录过程(本地或外部)

public class ApplicationSignInManager : SignInManager<User, int>
{    

     public override async Task SignInAsync(User user, bool isPersistent, bool rememberBrowser)
     {
         if (!user.isDeleted)
         {
             await base.SignInAsync(user, isPersistent, rememberBrowser);
         } 
         else
         {
             ...
         }                      
     }
}

或者创建一个自定义的UserStore 并覆盖GetUserAggregateAsync 方法(它在所有“查找”方法中调用):

public class CustomUserStore : UserStore<ApplicationUser>
{
    public CustomUserStore(ApplicationDbContext context) : base(context) { }

    protected override async Task<ApplicationUser> GetUserAggregateAsync(Expression<Func<ApplicationUser, bool>> filter)
    {
        var user = await base.GetUserAggregateAsync(filter);

        // if user is found but soft deleted then ignore and return null
        if (user != null && user.IsDeleted)
        {
            return null;
        }

        return user;
    }
}

【讨论】:

  • 只是想知道,在这种情况下,您将如何处理 [else]?我假设我需要返回一个值为 [Failure] 的 [SignInStatus] 模型,以使其看起来用户不存在,但没有要使用的返回参数。您需要做什么才能使其返回失败,以便在屏幕上可见(即登录时,请检查您的详细信息并重试,因为登录不存在)
  • @Hanho 你是对的,你不能返回SignInStatus。您可以尝试创建自定义UserStore 并过滤掉IsDeleted 用户,以便在尝试检索用户时返回“失败”的UserManager 方法
  • 过去一个月我一直在尝试按照您的建议进行操作,但我仍然无法弄清楚将其放置在哪里。我试图覆盖自定义用户存储中的用户对象(只是发现我无法使用 linq 过滤它并将其放回 IDBSet - 安全地将其强制转换为 IDBSet 返回 null)。 ApplicationDbContext 中的相同内容。我尝试了 FindByIdAsync 方法,方法是检查用户是否在那里被删除并返回 0(哪种有效),但如果返回 0,它会返回一个异常——这不是我所期望的。关于我可以在哪里进行的任何想法?谢谢
  • 太好了,感谢您的帮助 tmg,这似乎是我需要的。当尝试使用 IsDeleted 项目登录时,它成功识别出它已被删除并停止登录。但是我发现,如果您尝试使用与已删除的电子邮件地址相同的电子邮件地址注册新用户,则会引发错误,我猜这是由于处理身份的方式(不允许重复的电子邮件地址)。知道如何覆盖它,以便它只检查主键的 ID?
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2014-08-08
  • 1970-01-01
  • 2018-12-26
  • 2022-01-21
  • 2021-02-28
  • 1970-01-01
相关资源
最近更新 更多