注册新用户(test@here.com)时,我将以下内容保存到[dbo]中。AspNetUsers] 表:
| Email | NormalizedEmail | NormalizedUserName | UserName |
+-----------------+------------------+---------------------+-----------------+
| test@here.com | TEST@HERE.COM | TEST@HERE.COM | test@here.com |
但是,我认为用户名在我的布局中不是很用户友好,并希望将其更改为以下内容:
| Email | NormalizedEmail | NormalizedUserName | UserName |
+-----------------+------------------+---------------------+-----------------+
| test@here.com | TEST@HERE.COM | TEST@HERE.COM | John Smith |
另一方面,我发现通过使用帐户控制器中的重置密码或管理控制器中的更改密码方法,规范化用户名被用户名覆盖以获得类似的东西:
| Email | NormalizedEmail | NormalizedUserName | UserName |
+-----------------+------------------+---------------------+-----------------+
| test@here.com | TEST@HERE.COM | JOHN SMITH | John Smith |
有这样的事情会阻止我现在登录,因为它正在使用规范化用户名来识别不再是电子邮件......
几个问题:
- 为什么当我重置或更改密码时,我的规范化用户名被覆盖?
- 为什么它使用规范化用户名来记录?这对我来说没有意义,因为我们在登录界面中提供了一封电子邮件,它应该改用规范化电子邮件。
区分用于显示目的的用户名和用于标识目的的用户电子邮件会更方便。
谢谢你的帮助
西尔万
我想你和我一样,将Areas.Identity.Pages.Account
下的脚手架RegisterModel
更改为包含UserName
,因此UserName
不再设置为Input.Email
。
var user = new ApplicationUser { UserName = Input.UserName, Email = Input.Email }
var result = await _userManager.CreateAsync(user, Input.Password);
登录由 Login.cshtml.cs 和 Login.cshtml 处理,后者将Input.Email
作为第一个参数发送到SignInManager.PasswordSignInAsync()
。这种方法实际上期望一个UserName
,而不是一个Email
。
var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure: false);
我通过简单地更改代码以通过电子邮件查找正确的用户名来解决此问题。
string userName = _userManager.FindByEmailAsync(Input.Email).Result.UserName;
var result = await _signInManager.PasswordSignInAsync(userName, Input.Password, Input.RememberMe, lockoutOnFailure: false);