如何处理现有本地用户或新用户的外部身份验证

How to deal with External authentication for already existing local user or new user

我使用 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. Check if there is an User in the database already with that email.

回调时,第一个调用是 FindUserFromExternalProviderAsync, it search users using nameIdentifier, then if not found there is call to AutoProvisionUserAsync

Basically it creates a user with a Guid as Username ... In my database I am using Email as Username ... Is there any reason to use a Guid?

ApplicationUser's base class is IdentityUser,IdentityUser 在设计上有一个 ID 属性和一个电子邮件属性。这就是为什么除了电子邮件之外,大多数图书馆还利用 GUID 作为 ID 来实现可扩展性。如果您愿意,可以使用电子邮件作为 ID。