ASP.NET 身份:尝试添加具有现有 ID 的用户
Posted
技术标签:
【中文标题】ASP.NET 身份:尝试添加具有现有 ID 的用户【英文标题】:ASP.NET Identity: attempting to add user with existing ID 【发布时间】:2014-10-19 13:26:14 【问题描述】:ASP.NET Identity 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 之前检查新的用户对象是否存在? 我猜是的(因为它调用 FindByNameAsync 但它似乎不认为找到的用户对象是“现有的”。
【问题讨论】:
“去定义”有效吗?如果没有,您可以随时查看 GitHub 上的 APS.MVC 代码。 UserManager.CreateAsync 在自定义提供者中调用 UserTable 的 Insert 方法 @AndreiV 身份框架不是 MVC 堆栈的一部分,还没有开源 -(( 强烈建议更新到 Identity 2.1 - Identity v1 中的许多问题已得到解决。要查看UserManager
的实现,您必须使用反编译器,例如 DotPeek(我的最爱)。
【参考方案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 与我们尝试创建的 User 对象的 Id 不同时才会引发错误。
由于我们在插入之前生成了 ID,它实际上等于用户的电子邮件 - 这导致了问题。解决方案很简单:最好在插入数据库之前生成用户 ID。
【讨论】:
以上是关于ASP.NET 身份:尝试添加具有现有 ID 的用户的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core MVC:使用 SQL Server 身份验证连接到现有数据库
如何使用 ASP.NET Core Identity 将登录/注册系统添加到现有数据库?