问题描述
我使用ASP.Net Core 3 Identity和Identity Server 4进行身份验证...
在AspNetIdentity模板上,外部身份验证控制器回调方法将调用具有以下代码的AutoProvisionUserAsync方法:
var email = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Email)?.Value ??
claims.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value;
if (email != null) {
filtered.Add(new Claim(JwtClaimTypes.Email,email));
}
var user = new User {
UserName = Guid.NewGuid().ToString(),};
var identityResult = await _userManager.CreateAsync(user);
在我的数据库中,我使用电子邮件作为用户名...是否有使用Guid的理由?
我想大多数外部身份验证服务(Google,Facebook等)都提供电子邮件。
所以我的想法是:
- 检查数据库中是否已有该电子邮件的用户。
- 如果没有用户,请使用从外部身份验证服务获得的电子邮件创建一个。 还将外部身份验证添加到数据库中的用户;
- 如果数据库中有电子邮件用户,请检查其是否具有该外部登录名。 如果用户没有外部登录注册,请添加它。
这有意义吗?
解决方法
- 检查数据库中是否已有该电子邮件的用户。
在回调中,首先调用FindUserFromExternalProviderAsync,它使用nameIdentifier搜索用户,然后如果未找到,则调用AutoProvisionUserAsync
基本上,它创建一个以Guid作为用户名的用户... 在我的数据库中,我使用电子邮件作为用户名...是否有使用Guid的理由?
ApplicationUser的基类是IdentityUser,IdentityUser设计有一个ID道具和一个电子邮件道具。这就是为什么大多数库都利用GUID作为ID以及电子邮件的可扩展性的原因。您可以根据需要使用电子邮件作为ID。