我试图为MongoDB创建IUserLoginStore的自定义实现,我注意到当使用
UserManager<ApplicationUser>
使用
方法 var userResult = await _userManager.CreateAsync(user);
它通过
的实现GetUserNameAsync
FindByNameAsync
SetNormalizedUserNameAsync
GetUserIdAsync
我想澄清两个问题:
拥有NormalizedUsername和UserName的目的是什么?我能注意到的唯一区别是normalizedUserName是大写的。
我使用我的实现只存储用户从外部登录(Google +),是否有一种方法,我可以省略用户名和normmilizedusername,因为基本上,我在这三个字段中使用电子邮件,我觉得我在复制数据,这对我来说没有任何意义。
建议吗?
1)标准化阻止人们注册只有大小写字母不同的用户名。
- 是的,你可以(如果你真的想):
-
FindByNameAsync
应该搜索u.Name不区分大小写(你相信你的DB设置吗?) -
GetNormalizedUserNameAsync
应该返回user.Name.ToUpperCase() -
SetNormalizedUserNameAsync
不应该做任何事
-
请注意,2.1可以跳过数据库中name
列上的任何索引,并损害您的应用程序的性能(再次检查您的数据库)。或者导致"客户端"执行(并再次严重损害性能)。
我只在内部企业系统中使用这种"最小化"的User
类,它只使用特定的OAuth提供商,只接受来自指定域(Google Apps)的用户。这个系统不执行任何用户名搜索,我安全地在许多方法中抛出NotImplementedException
。
规范化名称确保URL编码使用的符号,如&, ?和引号不包括在内,因此它可以用作QueryString()或URL,并且它将在编码中毫发无损。
电子邮件不包含那些可能被验证检查/不允许的字符,所以在这种特殊情况下,Name和Normalized Name之间没有区别。