【问题标题】:Removing a user from backend created by IdentityServer4从 IdentityServer4 创建的后端删除用户
【发布时间】:2017-01-17 09:55:17
【问题描述】:

在使用 Identity Server 4 在 Asp.Net Core Web 应用程序中注册新的 User 时,我正在调试确认电子邮件流。

由于我已经注册了我的实际电子邮件,为了重复使用它,我使用SQL UpdateAspNetUsers 表中的UserNameEmail 修改为某个随机值。

现在,当我再次使用原始电子邮件注册时。我收到了duplicate user error

result = await _userManager.CreateAsync(user, model.Password);

我已经:

  • 已清除浏览器缓存。

  • 关闭本地 IIS Express

  • 重新启动 Visual Studio。

  • 在将UserNameEmail 更新回原始值后使用_userManager.DeleteAsync(),但这会给出带有描述Optimistic concurrency failure, object has been modifiedMicrosoft.AspNetCore.Identity.IdentityError

    Sql Server上运行此查询

    select * from INFORMATION_SCHEMA.COLUMNS where COLUMN_NAME in ( 'UserName' , 'Email')

我得到以下信息:

我知道这不是搞乱后端的好习惯,但这是开发环境,我可以使用另一封电子邮件继续我的工作。

我希望读者帮助了解如何安全地烧毁 User 以便能够重复使用电子邮件。

珍惜你的时间

【问题讨论】:

  • 通常您永远不想删除用户,因为您可能有其他带有外键引用的数据。此外,删除用户以便释放电子邮件地址以供再次使用,这不是一个常见的问题,因为电子邮件地址永远不会重新发布给新用户。我强烈建议不要删除用户,而是将帐户标记为非活动状态。如果用户再次返回该帐户,则您可以通过向他们发送电子邮件来重新激活它,他们必须单击链接等以证明他们拥有该帐户的位置才能重新访问您的系统。

标签: asp.net-core asp.net-identity sql-server-2016 identityserver4


【解决方案1】:

我同意 Kyle 的评论,为了进一步加快您的调试过程,您应该注意,如果您使用 gmail 来执行此操作,则可以使用一封电子邮件来调试此过程。

从 google/gmails 的角度来看 myaccount@gmail.com == my.acount@gmail.com == m.y.a.c.c.ount@gmail.com 等等等等,只要试试看,谷歌会忽略电子邮件中的所有句点字符。如果您仅通过电子邮件地址的本地部分进行枚举,则可以枚举/耗尽 ~2^8 封电子邮件(在此示例中)。但从您的应用程序方面来看,myaccount@gmail.com 与 my.account@gmail.com 不同,即它们是不同的用户帐户。基本上,您可以使用一封电子邮件来测试您的此功能,而无需删除用户。

【讨论】:

    【解决方案2】:

    我是这样做的,最后通过了讨厌的“并发失败”错误消息...这适用于 ASP.NET CORE 2.2

    首先通过 FindByName 方法获取用户对象。 从分配的角色中删除用户(在这种情况下,我硬编码了“管理员”,因为这是我感兴趣的角色,但请填写您自己的角色),然后删除该用户。

            //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();
    

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2016-04-17
      • 2022-11-26
      相关资源
      最近更新 更多