У меня есть сайт MVC 5, работающий с внешними логинами. Я лишь немного изменил его, чтобы имя пользователя и фамилия были отделены от электронной почты.
Я не регистрирую нового пользователя, я просто вхожу через Fackbook... (это может быть проблемой?) Если я вхожу через Facebook, он создает пользователя в таблицах идентификации (но не создается хэш пароля).
Однако, когда я перехожу к контроллеру «Управление», он показывает
External Logins: 0 [ Manage ]
И когда я нажимаю 'manage'
, я перехожу к «Управлению/управлению логинами» и вижу кнопку Facebook... но при нажатии на кнопку FB я получаю 'an error has occurred'
Заглянув в Manage Controller, я вижу, что этот метод срабатывает, а там, где он собирает 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()
возвращает идентификатор пользователя... он просто не получает пользователя. Я только что попробовал это с недавно созданным локальным пользователем.
Этот код показывает кнопку «удалить» только в том случае, если существует существующий логин пользователя... но логин пользователя не создается при входе в систему через внешний логин. Это нормально? Я ожидал, что userLogin будет создан и привязан к внешнему, но я не уверен, как идентификатор справляется с этим аспектом...
Как мне это сделать, чтобы мои пользователи могли по-прежнему отключать свою учетную запись FB? Или нет реальной учетной записи, от которой можно отсоединиться, поскольку это внешний вход в систему, и она никогда не регистрировалась как локальная учетная запись? ... Это то, что мне не хватает? Это ожидаемое поведение?
PS: мне пришлось добавить строку кода, чтобы убить любые существующие сеансы перед вызовом ChallengeResult
в методе 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» отображается LoginProvider «Facebook», а userId — это мой пользователь. Однако поле ApplicationUserId имеет значение null.. после помещения идентификатора пользователя в это поле « Кнопка «удалить» отображается на странице управления... что мне не хватает? Как не вводится applicationUserID?.. еще одно исправление для удостоверения по умолчанию?