如何为已经存在的本地用户或新用户处理外部身份验证

问题描述

我使用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作为用户名用户...

在我的数据库中,我使用电子邮件作为用户名...是否有使用Guid的理由?

我想大多数外部身份验证服务(Google,Facebook等)都提供电子邮件

所以我的想法是:

  1. 检查数据库中是否已有该电子邮件用户
  2. 如果没有用户,请使用从外部身份验证服务获得的电子邮件创建一个。 还将外部身份验证添加数据库中的用户
  3. 如果数据库中有电子邮件用户,请检查其是否具有该外部登录名。 如果用户没有外部登录注册,请添加它。

这有意义吗?

解决方法

  1. 检查数据库中是否已有该电子邮件的用户。

在回调中,首先调用FindUserFromExternalProviderAsync,它使用nameIdentifier搜索用户,然后如果未找到,则调用AutoProvisionUserAsync

基本上,它创建一个以Guid作为用户名的用户... 在我的数据库中,我使用电子邮件作为用户名...是否有使用Guid的理由?

ApplicationUser的基类是IdentityUser,IdentityUser设计有一个ID道具和一个电子邮件道具。这就是为什么大多数库都利用GUID作为ID以及电子邮件的可扩展性的原因。您可以根据需要使用电子邮件作为ID。