ExternalLoginConfirmation返回用户已存在

时间:2017-12-06 08:59:00

标签: c# asp.net-mvc asp.net-mvc-4 oauth-2.0

我有一个非常奇怪的情况,我不明白。

  1. 我有一个使用Google和Facebook身份验证的MVC Web应用程序。用户通过身份验证后,会重定向到ExternalLoginCallback操作进行注册。

  2. 输入电子邮件地址后 - 用户使用ExternalLoginConfirmation操作

    在系统中注册
        if (User.Identity.IsAuthenticated)
        {
            return RedirectToAction("Index", "Home");
        }
    
        if (ModelState.IsValid)
        {
            // Get the information about the user from the external login provider
            var info = await AuthenticationManager.GetExternalLoginInfoAsync();
            if (info == null)
            {
                return View("ExternalLoginFailure", "_UnauthorizedLayout");
            }
    
            var firstName = GetUserClaim(info, ClaimTypes.GivenName);
            var lastName = GetUserClaim(info, ClaimTypes.Surname);
    
            var user = new ApplicationUser { UserName = model.Email,
                                             FirstName = firstName,
                                             LastName = lastName,
                                             Email = model.Email };
    
            var result = await UserManager.CreateAsync(user);
            if (result.Succeeded)
            {
                // add login
                result = await UserManager.AddLoginAsync(user.Id, info.Login);
                if (result.Succeeded)
                {
                    result = await AddUserClaims(user, info);
                    if (result.Succeeded)
                    {
                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                        return RedirectToLocal(returnUrl);
                    }
                }
            }
            AddErrors(result);
        }
    
        ViewBag.ReturnUrl = returnUrl;
        return View("ExternalLoginConfirmation", "_UnauthorizedLayout", model);
    
  3. 这都非常标准。

    问题是有些用户报告他们在使用facebook / google进行身份验证后尝试注册,并且他们收到错误消息称该用户已存在。这肯定不是真的,因为他们尝试过多个从未注册过的电子邮件。

    我无法在计算机上重现这一点。我只能假设问题在于这一行

    var result = await UserManager.CreateAsync(user);

    返回用户存在错误。我100%肯定用户尚未注册。我想这里有某种竞争条件。真的不知道。

    任何帮助都会非常受欢迎!

1 个答案:

答案 0 :(得分:0)

我无法弄清楚为什么会这样,但我最后使用支票查看用户是否已经注册,以及他是否登录了他。