ASP.NET MVC "SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);"一直返回失败

问题描述

我对 ExternalLogin 操作进行了一些更改。我在我的用户表中添加一个新字段,作为名字,并添加代码以从 facebook 请求名字。这可能是我收到错误的原因。我不会在这里发布用于 facebook 外部登录的应用程序机密,但您知道它存在于我的代码中。当我向 facebook 注册一个新用户时,它会工作并保持用户登录状态,并将用户添加数据库中,也会得到正确的名字。但是,当我注销并尝试使用 facebook 登录时,它会强制我注册而不是登录(它重定向到使用 facebook 页面注册,说“您已成功通过 facebook 进行身份验证。请输入此站点用户名”并单击注册按钮完成登录。”) 这是我所做更改的代码: 在 Startup.Auth 类中:

app.UseFacebookAuthentication(new FacebookAuthenticationoptions()
            {
                AppId = "2737863089761791",AppSecret = "",BackchannelHttpHandler = new httpclienthandler(),UserinformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name",Scope = { "email" },Provider = new FacebookAuthenticationProvider()
                {
                    OnAuthenticated = async context =>
                    {
                        context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccesstoken",context.Accesstoken));
                        foreach (var claim in context.User)
                        {
                            var claimType = string.Format("urn:facebook:{0}",claim.Key);
                            string claimValue = claim.Value.ToString();
                            if (!context.Identity.HasClaim(claimType,claimValue))
                                context.Identity.AddClaim(new System.Security.Claims.Claim(claimType,claimValue,"XmlSchemaString","Facebook"));
                        }
                    }
                }
            });

在我的 AccountController 中的 ExternalLoginCallback 操作中:

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
            var firstName = loginInfo.ExternalIdentity.Claims.First(c => c.Type == "urn:facebook:first_name").Value;
            if (loginInfo == null)
            {
                return RedirectToAction("Login");
            }

            // Sign in the user with this external login provider if the user already has a login
            var result = await SignInManager.ExternalSignInAsync(loginInfo,isPersistent: false);
            switch (result)
            {
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
                case SignInStatus.LockedOut:
                    return View("Lockout");
                case SignInStatus.Requiresverification:
                    return RedirectToAction("SendCode",new { ReturnUrl = returnUrl,RememberMe = false });
                case SignInStatus.Failure:
                default:
                    // If the user does not have an account,then prompt the user to create an account
                    ViewBag.ReturnUrl = returnUrl;
                    ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                    return View("ExternalLoginConfirmation",new ExternalLoginConfirmationviewmodel { Email = loginInfo.Email,Name = firstName });
            }

我认为它会将我重定向注册页面,因为该行

var result = await SignInManager.ExternalSignInAsync(loginInfo,isPersistent: false);

在 ExternalLoginCallback 内部返回失败,我不知道为什么。它必须返回成功才能进入案例:

case SignInStatus.Success

我的 ExternalLoginConfirmation 操作出错,所以我将一些代码放在 try-catch 块中。它解决了我的问题,但我仍然不知道错误来自哪里:

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationviewmodel model,string returnUrl)
        {

            if (User.Identity.IsAuthenticated)
            {
                return RedirectToAction("Index","Manage");
            }

            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");
                }

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

                  

                    try
                    {
                        var useraux = await UserManager.FindByEmailAsync(model.Email);
                        result = await UserManager.AddLoginAsync(useraux.Id,info.Login);
                    }
                    catch (DbEntityValidationException e)
                    {
                        foreach (var eve in e.EntityValidationErrors)
                        {
                            Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",eve.Entry.Entity.GetType().Name,eve.Entry.State);
                            Response.Write("Object: " + eve.Entry.Entity.ToString());
                            Response.Write(" " +
                                "");
                            foreach (var ve in eve.ValidationErrors)
                            {
                                Console.WriteLine("- Property: \"{0}\",Error: \"{1}\"",ve.PropertyName,ve.ErrorMessage);
                                Response.Write(ve.ErrorMessage + "" +
                                    "");
                            }
                        }
                        //throw;
                    }


                    if (result.Succeeded)
                    {
                        //--
                        //await StoreFacebookAuthToken(user);
                        await SignInManager.SignInAsync(user,isPersistent: false,rememberbrowser: false);
                        return RedirectToLocal(returnUrl);
                    }
                }
                AddErrors(result);
            }

            ViewBag.ReturnUrl = returnUrl;
            return View(model);
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)