C# ASP.NET Identity AddLoginAsync失败-已使用名称/电子邮件X

C# ASP.NET Identity AddLoginAsync失败-已使用名称/电子邮件X,c#,asp.net,asp.net-identity,C#,Asp.net,Asp.net Identity,通过ASP.NET标识添加外部登录的默认代码出现问题 我的帐户控制器ExternalLoginConfirmation方法中有以下代码: var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user); if (result.Succeeded) { result = await UserManag

通过ASP.NET标识添加外部登录的默认代码出现问题

我的帐户控制器ExternalLoginConfirmation方法中有以下代码:

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
   result = await UserManager.AddLoginAsync(user.Id, info.Login);
   if (result.Succeeded)
   {
      //do stuff
   }
}
CreateAsync调用返回结果。successed==true。但是,当它流经AddLoginAsync方法时,该方法返回result.successed==false,并出现以下错误:

Name foo@bar.com is already taken.
Email 'foo@bar.com' is already taken.
当我查看aspnetusers表时,我看到了CreateUserAsync方法中预期的该用户的新行。如果AddLoginAsync应该向现有用户添加登录名,为什么它会抛出错误,就像它希望用户不存在一样?如果之前未在新用户实例中填充用户名和电子邮件,则无法调用CreateAync

开箱即用标识设置之间的唯一区别是我创建了一个customer ApplicationUser类,该类使用int作为Id而不是字符串


有什么想法吗?

您是否使用外部登录提供商?如果不是,则不应调用AddLoginAsync()


CreateAsync(用户)正在本地环境中为您创建用户记录。之后,您可以选择使用SignInAsync()登录用户,但我认为您不需要调用AddLoginAsync()。

您使用的是外部登录提供程序吗?如果不是,则不应调用AddLoginAsync()


CreateAsync(用户)正在本地环境中为您创建用户记录。之后,您可以选择使用SignInAsync()让用户登录,但我认为您不需要调用AddLoginAsync()。

错误消息是一种误导。即使这是MS在创建新web应用程序时提供的默认代码,
CreateAsync
调用也不会更新
user
对象,因为它会让您相信。在这种情况下,user.Id在传递到
AddLoginAsync
时仍然等于0,因此在创建用户时,您没有对象的当前实例

改变

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
  //do stuff
}


修复了该问题。

错误消息只是转移视线。即使这是MS在创建新web应用程序时提供的默认代码,
CreateAsync
调用也不会更新
user
对象,因为它会让您相信。在这种情况下,user.Id在传递到
AddLoginAsync
时仍然等于0,因此在创建用户时,您没有对象的当前实例

改变

var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
  //do stuff
}


修复问题。

如上所述,这在ExternalLoginConfirmation ActionResult方法中。只有在我使用外部登录提供商时才会被点击,当外部登录提供商(在本例中为Facebook)已经验证了用户并将该信息传递回我时才会发生这种情况,现在我已经提示输入电子邮件地址作为用户名以完成注册过程。如上所述,这在ExternalLoginConfirmationActionResult方法中。只有当我使用外部登录提供商时,它才会被点击,并且当外部登录提供商(在本例中为Facebook)已经验证了用户并将该信息传递回我,现在我已经提示输入电子邮件地址作为用户名以完成注册过程时,才会发生这种情况。当然,您正在尝试创建新用户,但永远不要评估用户创建的结果。如果结果返回successed=false或Errors集合中有内容,会发生什么情况?当然,您正在尝试创建新用户,但从未评估用户创建的结果。如果结果返回successed=false或Errors集合中有内容,会发生什么情况?