我有一个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?..默认身份的另一个修复?
答案 0 :(得分:1)
我已将我的身份模型转移到与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}}