1

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

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

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

External Logins: 0 [ Manage ]

当我单击时'manage',它会带我到“管理/管理登录”并显示一个 Facebook 按钮......但是在单击 FB 按钮时,我得到'an error has occurred'

查看管理控制器,我看到这个方法被击中,它收集用户登录的地方,它没有得到任何东西。

 // 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 被创建并引用到外部,但我不确定身份如何处理这方面......

我该如何解决这个问题,以便我的用户仍然可以取消关联他们的 FB 帐户?还是没有真实帐户可以取消关联,因为它是外部登录名并且从未真正注册为本地帐户?...这就是我所缺少的吗?这是预期的行为吗?

ChallengeResultPS:我必须在调用ExternalLoginAccountContoller 方法之前添加一行代码来终止任何现有会话:

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

这会导致任何问题吗?必须用这条线来修复 Identity 似乎很奇怪..(虽然它被谈论了很多)

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

4

2 回答 2

1

在这里找到了答案

我已将我的身份模型移动到与 Web 项目分开的“数据”项目中。这篇文章中的人也有类似的问题,他的 ID 也为空。对 fluent-api 稍作改动,瞧。

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);
于 2015-10-02T15:45:03.127 回答
0

我敢于进行如下更改,并且效果很好:

//modelBuilder.Entity<IdentityUser>().ToTable("Usuario", "dbo");
 var user = modelBuilder.Entity<IdentityUser>()
           .ToTable("Usuario", "dbo");

            user.HasMany(u => u.Logins).WithRequired().HasForeignKey(ul => ul.UserId);
于 2016-06-08T17:54:08.593 回答