首页 > 解决方案 > ASP.NET MVC:表 AspNetUserLogins 不记得数据

问题描述

AspNetUserlogins 表不记得数据。它应该记住用户通过外部登录(如 Facebook)注册时的数据。我已经使用 facebook 实现了外部登录,但出现了一些错误。有谁知道哪个方法/动作和哪个指令确切负责将数据保存到这个表中?这可能是来自帐户控制器的操作。

编辑:我发现它是帐户控制器中的 ExternalLoginConfirmation 操作。它在指令中给了我一个错误:

result = await UserManager.AddLoginAsync(user.Id, info.Login);

(必须是将用户添加到 AspNetUserLogin 表的行),这就是为什么我将它放在 try-catch 块中并解决了我的问题,但我认为它根本没有被执行。它只是不再给我验证错误。我认为它有问题,因为我从 facebook 请求更多数据,比如用户的名字。它可能更改了登录信息中的某些内容,并且无法将其添加到数据库中。或者可能是因为我在我的用户身份中添加了字段“名称”(用于名字)。

我的启动身份验证类:

var x = new FacebookAuthenticationOptions();
x.Scope.Add("email");
x.AppId = "2737863089761791";
//x.Scope.Add("public_profile");
x.AppSecret = "";
x.UserInformationEndpoint = "https://graph.facebook.com/v2.8/me?fields=id,name,email,first_name,last_name";
x.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"));

        }

    }
};

x.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie;
app.UseFacebookAuthentication(x);

(我从 facebook 请求一些字段,比如名字)。我删除了应用程序机密。

我的ExternalLoginConfirmation方法:

[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.Email, 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);
}

标签: c#asp.net-mvc

解决方案


推荐阅读