MVC 5与外部登录的身份使userLogins始终为0

时间:2015-10-02 13:54:18

标签: asp.net-mvc facebook asp.net-identity-3

我有一个MVC 5站点运行身份与外部登录。我只是略微修改它以使f / l名称和用户名与电子邮件分开。

我没有注册新用户,我只是通过Fackbook登录......(这可能是问题?) 如果我通过Facebook 登录,它会在身份表中创建一个用户(但不会创建密码哈希)。

但是,当我导航到“管理”控制器时,它正在显示

External Logins: 0 [ Manage ]

当我点击'manage'时,它会转到'管理/管理登录'并显示一个Facebook按钮......但点击FB按钮后,我得到'an error has occurred'

查看管理控制器,我看到这个方法受到了攻击,并且它收集了userLogins,它没有得到任何。

 // GET: /Manage/ManageLogins
    public async Task<ActionResult> ManageLogins(ManageMessageId? message)
    {
        ViewBag.StatusMessage =
            message == ManageMessageId.RemoveLoginSuccess ? "The external login was removed."
            : message == ManageMessageId.Error ? "An error has occurred."
            : "";
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user == null)
        {
            return View("Error");
        }
    --> var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId()); <-- here it doesn't get any
        var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();
        ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;
        return View(new ManageLoginsViewModel
        {
            CurrentLogins = userLogins,
            OtherLogins = otherLogins
        });
    }

注意:UserManager.GetLoginsAsync始终返回0并且我已经验证User.Identity.GetUserId()正在返回用户的ID ...它只是没有获得用户。我刚刚尝试了一个新创建的本地用户。

如果存在现有的userLogin,此代码仅显示“删除”按钮...但是通过外部登录登录时没有创建userLogin。 这是正常的吗?我期待创建userLogin并引用外部,但我不确定身份如何处理这个方面......

如何解决这个问题,以便我的用户仍然可以解除他们的FB帐户?或者没有真正的帐户可以解除关联,因为它是外部登录而且从未真正注册为本地帐户?...这是我缺少的吗?这是预期的行为吗?

PS:我必须在AccountContoller的ChallengeResult方法中ExternalLogin调用之前添加一行代码来终止任何现有会话:

// POST: /Account/ExternalLogin
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
 here-->     ControllerContext.HttpContext.Session.RemoveAll();

        // Request a redirect to the external login provider
        return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
    }

这会导致任何问题吗?用这条线开箱即可修复身份似乎很奇怪..(虽然它被谈了很多)

编辑: 我注意到在'IdentityUserLogins'表中,它显示的是'Facebook'的LoginProvider而userId是我的用户..但是,ApplicationUserId字段为null ..将userid放入此字段后,'remove'按钮显示在管理页面中.... 我错过了什么? 如何输入applicationUserID?..默认身份的另一个修复?

2 个答案:

答案 0 :(得分:1)

Found the answer here

我已将我的身份模型转移到与Web项目分开的“数据”项目中。这篇文章的人也有类似的问题,他的Id也是空的。流利的api和voila有点变化。

var user = modelBuilder.Entity<TUser>()
.ToTable("AspNetUsers");
user.HasMany(u => u.Roles).WithRequired().HasForeignKey(ur => ur.UserId);
user.HasMany(u => u.Claims).WithRequired().HasForeignKey(uc => uc.UserId);
user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
user.Property(u => u.UserName).IsRequired();

modelBuilder.Entity<TUserRole>()
.HasKey(r => new { r.UserId, r.RoleId })
.ToTable("AspNetUserRoles");

modelBuilder.Entity<TUserLogin>()
.HasKey(l => new { l.UserId, l.LoginProvider, l.ProviderKey})
.ToTable("AspNetUserLogins");

modelBuilder.Entity<TUserClaim>()
.ToTable("AspNetUserClaims");

var role = modelBuilder.Entity<TRole>()
.ToTable("AspNetRoles");
role.Property(r => r.Name).IsRequired();
role.HasMany(r => r.Users).WithRequired().HasForeignKey(ur => ur.RoleId);

答案 1 :(得分:0)

我敢于按照以下方式进行更改,并且工作得非常好:

{{1}}
相关问题