NormalizedUserName VS DotNet Core中的用户名

jac*_*per 17 asp.net-identity asp.net-core-mvc asp.net-core-identity

我正在尝试为MongoDB创建IUserLoginStore的自定义实现,我在使用时注意到了

UserManager<ApplicationUser>
Run Code Online (Sandbox Code Playgroud)

用这个方法

 var userResult = await _userManager.CreateAsync(user);
Run Code Online (Sandbox Code Playgroud)

它经历了实施

GetUserNameAsync
FindByNameAsync
SetNormalizedUserNameAsync
GetUserIdAsync
Run Code Online (Sandbox Code Playgroud)

我想澄清两个问题:

  • 拥有NormalizedUsername和UserName的目的是什么?唯一的区别是我能注意到normalizedUserName是大写的.

  • 我只使用我的实现来存储来自外部登录(Google plus)的用户,有没有办法我可以省略用户名和NormilizedUserName,因为基本上,我在这三个领域使用电子邮件,我感觉我复制数据对我来说没有任何意义.

任何建议?

blo*_*art 17

1)标准化会阻止人们注册只在字母大小写方面不同的用户名.

2)否 - 这些字段是基本数据模型的一部分.

  • 不.这完全在你的手中我害怕. (3认同)
  • 是的,已经进行了标准化,以阻止人们注册仅字母大小写不同的用户名。但是OP所要问的,即“在数据库中拥有NormalizedUsername的目的是什么”,是与运行时在SQL查询中进行操作相比,它提高了性能。此处的更多信息:https://github.com/aspnet/Identity/issues/351 (3认同)

Dmi*_*try 14

  1. 是的,你可以(如果你真的想要):
    1. FindByNameAsync 应该通过u.Name搜索不区分大小写(你相信你的数据库设置吗?)
    2. GetNormalizedUserNameAsync 应该返回user.Name.ToUpperCase()
    3. SetNormalizedUserNameAsync 什么都不做

请注意2.1可以跳过nameDB中列的任何索引并损害应用程序的性能(再次检查数据库).或导致"客户端"执行(并再次,显着损害性能).取决于您的实施.

User仅在内部企业系统中使用此类"最小化" 类,该系统仅使用特定OAuth提供程序并仅接受来自指定域(Google Apps)的用户.这个系统不会按用户名执行任何搜索,我安全地使用NotImplementedException了许多方法.

  • 一些评论: 1)在大多数情况下,我建议使用 `ToUpperInvariant`。2)我认为`user.Name`应该是`user.UserName`。3) 在许多情况下,我还会替换相关的电子邮件规范化变体(例如“FindByEmail”) 4) 如果您使用此技术,请考虑将规范化列配置为稀疏列。5) 顺便说一句,在 .Net Core 之前我必须做同样的事情。默认行为是通过将“Upper”嵌入到生成的 SQL 中来绕过现有索引来进行规范化。 (2认同)