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

时间:2014-08-26 09:13:47

标签: asp.net asp.net-mvc asp.net-identity

ASP.NET Identity version 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 个答案:

答案 0 :(得分: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。