我有一个使用外部登录名运行身份的 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 帐户?还是没有真实帐户可以取消关联,因为它是外部登录名并且从未真正注册为本地帐户?...这就是我所缺少的吗?这是预期的行为吗?
ChallengeResult
PS:我必须在调用ExternalLogin
AccountContoller 方法之前添加一行代码来终止任何现有会话:
// 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?.. 默认身份的另一个修复?