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

Identityserver4 如何处理现有本地用户或新用户的外部身份验证,identityserver4,openid-connect,asp.net-core-identity,Identityserver4,Openid Connect,Asp.net Core Identity,我正在使用ASP.Net Core 3 Identity和Identity Server 4进行身份验证 在AspNetIdentity模板上,外部身份验证控制器回调方法调用具有以下代码的方法: var email = claims.FirstOrDefault(x => x.Type == JwtClaimTypes.Email)?.Value ?? claims.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Val

我正在使用ASP.Net Core 3 Identity和Identity Server 4进行身份验证

在AspNetIdentity模板上,外部身份验证控制器回调方法调用具有以下代码的方法:

  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

我想大多数外部认证服务(谷歌、Facebook等)都会提供电子邮件

所以我的想法是:

  • 检查数据库中是否有用户已使用该电子邮件
  • 如果不存在用户,请使用从外部身份验证服务获得的电子邮件创建一个用户。 还向数据库中的用户添加外部身份验证
  • 如果数据库中有用户使用该电子邮件,请检查该用户是否具有该外部登录名。 如果用户没有外部登录注册并添加它
  • 这有意义吗

  • 检查数据库中是否有用户已使用该电子邮件
  • 在回调时,第一个调用是to,它使用nameIdentifier搜索用户,若并没有找到,则调用to

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


    的基类是,IdentityUser有一个用于ID的道具和一个用于电子邮件的道具。这就是为什么大多数库除了利用电子邮件作为ID外,还利用GUID作为扩展性的原因。如果愿意,您可以使用电子邮件作为ID。

    我没有考虑使用电子邮件作为ID,而是使用int作为ID。使用Guid作为ID会更好吗?我不确定您的问题是什么?你的意思是如果int比guid好吗?如果这是你的问题,可以这样做,你可以为它实现一个定制的ApplicationUser。我通常在所有实体ID中使用INT(自动递增),包括User。但是,ASP.NET Core 3 Identity使用字符串类型作为ID,并将其填充为Guid。我想知道是否有任何与外部身份验证相关的“隐藏”原因?我真的不认为使用Guid有什么好处,除了:1。更容易在数据库之间合并表;2.无需调用数据库即可创建ID。在ASP.NET上,还有一个通用的IdentityUser类,您可以为ID使用任何类型:IdSvr4使用带有字符串ID的IdentityUser作为基础,但您可以自定义应用程序用户,如上所述关于GUID的优缺点,我可以向您的项目添加更多内容,如:1。GUID在表、数据库和服务器2之间是唯一的。简化跨多台服务器的数据库分发3。大多数复制场景都需要GUID列——但归根结底,这完全取决于您的需求——下面是一篇很好的文章