我正在使用Identity Server 4在Asp.Net Core Web应用程序中注册新的User
时调试确认电子邮件流。
由于我已经注册了我的实际电子邮件,要重复使用它,我使用UserName
修改了Email
表中的AspNetUsers
和SQL Update
到一些随机值。
现在我再次注册原始电子邮件。我收到了duplicate user error
result = await _userManager.CreateAsync(user, model.Password);
我已经:
清除浏览器缓存。
关闭本地IIS Express
重新启动Visual Studio。
将_userManager.DeleteAsync()
和UserName
更新回原始值后使用Email
,但这会为Microsoft.AspNetCore.Identity.IdentityError
提供说明Optimistic concurrency failure, object has been modified
。
在Sql Server
select * from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME in ( 'UserName' , 'Email')
我得到以下内容:
我知道这不是一个混乱使用后端的好习惯,但这是开发环境,我可以继续使用另一封电子邮件。
我会请求读者帮助理解如何安全地烧焦User
以便能够重复使用该电子邮件。
感谢您的时间
答案 0 :(得分:1)
我同意Kyle的评论并进一步加快您的调试过程,您应该注意,如果您使用gmail执行此操作,您可以使用一封电子邮件调试此过程。
来自google / gmails perspective myaccount@gmail.com
== my.acount@gmail.com
== m.y.a.c.c.ount@gmail.com
等等只是尝试一下,谷歌会忽略电子邮件中的所有句点字符。如果您只是枚举电子邮件地址的本地部分,则可以枚举/耗尽~2 ^ 8封电子邮件(在此示例中)。但是从您的应用程序方面来看,myaccount @ gmail.com与my.account@gmail.com不同,即它们是不同的用户帐户。基本上,您可以使用一封电子邮件来测试您的此功能,而无需删除用户。
答案 1 :(得分:0)
这是我的方法,终于通过了令人讨厌的“并发失败”错误消息...在ASP.NET CORE 2.2中有效
首先通过FindByName方法获取用户对象。 从分配的角色中删除用户(在这种情况下,我将硬编码为“ Admin”,因为这是我感兴趣的角色,但您自己填写),然后删除该用户。
//Delete user.
//Obtain the user object through the FindByName method first.
//Remove the user from their assigned Role, then delete the user.
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
ApplicationUser delAppUser = new ApplicationUser
{
Email = "SomeEmailForindividualAdminUser",
UserName = "SomeUsernameindividualAdminUser"
};
Task <ApplicationUser> taskGetUserAppUser = userManager.FindByNameAsync(delAppUser.UserName);
taskGetUserAppUser.Wait();
Task<IdentityResult> taskRemoveFromRoleAppUser = userManager.RemoveFromRoleAsync(taskGetUserAppUser.Result, "Admin");
taskRemoveFromRoleAppUser.Wait();
Task<IdentityResult> taskDeleteAppUser = userManager.DeleteAsync(taskGetUserAppUser.Result);
taskDeleteAppUser.Wait();