Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 如何更改ASP.NET身份用户';是否在不需要电子邮件确认的情况下发送电子邮件?_Asp.net Core_Asp.net Identity - Fatal编程技术网

Asp.net core 如何更改ASP.NET身份用户';是否在不需要电子邮件确认的情况下发送电子邮件?

Asp.net core 如何更改ASP.NET身份用户';是否在不需要电子邮件确认的情况下发送电子邮件?,asp.net-core,asp.net-identity,Asp.net Core,Asp.net Identity,我们有许多不懂技术的用户,他们发现使用常规方法更改电子邮件非常具有挑战性(单击登录页面上的链接,输入他们的电子邮件,检查他们的收件箱,单击电子邮件中的链接进行确认)。我们想让网站管理员能够直接更改电子邮件,而不需要用户做任何事情 我意识到这有一定的危险性,但我们有适当的检查,以确保我们将使用正确的新电子邮件 似乎如果我有数据库中的现有用户和管理页面上中的修改用户,我就可以这样做 existingUser.Email = modifiedUser.Email; existingUser.N

我们有许多不懂技术的用户,他们发现使用常规方法更改电子邮件非常具有挑战性(单击登录页面上的链接,输入他们的电子邮件,检查他们的收件箱,单击电子邮件中的链接进行确认)。我们想让网站管理员能够直接更改电子邮件,而不需要用户做任何事情

我意识到这有一定的危险性,但我们有适当的检查,以确保我们将使用正确的新电子邮件

似乎如果我有数据库中的现有用户和管理页面上
中的修改用户,我就可以这样做

  existingUser.Email = modifiedUser.Email;
  existingUser.NormalizedEmail = modifiedUser.Email.ToUpper();
  existingUser.UserName = modifiedUser.Email;
  existingUser.NormalizedUserName = modifiedUser.Email.ToUpper();
  _appDbContext.Users.Update(existingUser);
  await _appDbContext.SaveChangesAsync();
这似乎是可行的(有一点需要注意,请参见下文),但考虑到我从未见过这样的建议,而且我所看到的每个示例都创建了一个令牌并使用了
UserManager.SetEmailAsync
,我想知道我是否遗漏了什么

一个让我更加怀疑的警告是,当我尝试上述方法时,它创建了一个新用户,其详细信息与现有用户相同,但新的电子邮件。我无法复制这一点,所以无法确定是什么原因造成的


有谁能对处理这个问题的最佳方法发表评论吗?谢谢。

您可以设置并确认电子邮件,而无需发送任何此类电子邮件。使用ASP.NET核心标识提供的
UserManager

// set the email on the user, but don't send any email
await _userManager.SetEmailAsync(currentUser, newEmailAddress);

//generate an email confirmation token
var emailConfirmationToken = await _userManager.GenerateEmailConfirmationTokenAsync(existingUser);

//confirm the new email right away
result = await _userManager.ConfirmEmailAsync(existingUser, emailConfirmationToken);

我对此很好奇,但由于我展示的方式似乎有效,并且不需要注入另一个依赖项,我对它是否有任何问题感兴趣。哦,好的。如果您想避免依赖关系,那么您可以在自己的代码中模仿UserManager在数据库级别内部所做的工作:我对依赖关系没有强烈的反对意见,但想知道我是否需要它。我当然宁愿注入而不是复制他们的代码,冒着代码过时的风险。感谢您的评论我们尝试了您的代码,它更改了数据库中的email和normalisedemail字段,但没有更改username和normalisedusername字段,因此用户无法使用新的电子邮件地址登录。知道为什么吗?如果我必须手动设置另外两个,我也可以这样做,而不必麻烦用户管理器。@avrohmyisroel-ASP.NET Identity将用户名作为一个单独的字段保存,您也可以使用SetUserNameAsync方法更新用户名。我知道ASP.NET Identity公开了用户名和电子邮件地址的登录机制,因此,如果您调用的是用户名版本,这将解释失败的原因。在我的应用程序中,用户名和电子邮件都存储相同的值,因此每当更新一个用户名和电子邮件时,我都会更新它们。除了更新数据库中的值外,exposed方法还更新安全戳,以便在框架中有其他行为发生