首页 文章

ASP.NET标识:尝试添加具有现有ID的用户

提问于
浏览
0

ASP.NET身份版本1.0

如果我们尝试添加ID已存在于数据库中的用户,UserManager.CreateAsync(user,password)方法调用的默认行为是什么?

我问的是前段时间以下的代码行

IdentityResult result = await UserManager.CreateAsync(user, password);

返回一个非空的错误列表的IdentityResult对象,表示“具有ID [ID]的用户已经存在” .

但是现在(我们没有做太多更改)我们在尝试在数据库中插入新用户记录时遇到异常 . 在这两种情况下,UserManager.CreateAsync在我们的IUserStore实现中调用FindByNameAsync,该方法查找并返回正确的User对象 .

如何查看UserManager.CreateAsync方法的内部实现?在调用IUserStore的CreateAsync之前,它是否检查新的User对象是否存在?我想它确实(因为它调用FindByNameAsync但似乎它不认为发现User对象是“现有的” .

1 回答

  • 1

    我找到了使用DotPeek的答案(感谢trailmax的建议) . 是的,UserManager.CreateAsync进行验证(通过UserValidator类),验证器(以及其他条件)具有以下代码:

    TUser owner = await this.Manager.FindByNameAsync(user.UserName);
        if ((object) owner != null && owner.Id != user.Id)
          errors.Add(...);
    

    因此,正如我们所看到的那样,检查具有此UserName的用户是否已经存在但是仅当该用户的Id与我们尝试创建的用户对象的Id不同时才会引发错误 .

    由于我们在插入之前生成了Id,它实际上等于用户的电子邮件 - 这导致了问题 . 解决方案很简单:最好在将用户ID插入数据库之前生成用户ID .

相关问题