2

Я пытаюсь реализовать аутентификацию формы в ядре ASP.Net с аутентификацией Google и Facebook. Я последовал за некоторыми учебниками, и после некоторых битв мне удалось заставить его работать и то, и другое.Внешняя аутентификация AspNet Core как с Google, так и с Facebook

Однако проблема заключается в том, что я не могу использовать обе аутентификации для одного и того же электронного письма.

Например, мой адрес электронной почты: '[email protected]'. Я использовал аутентификацию Facebook для входа в систему сначала ... Зарегистрировал мою электронную почту, и она успешно работала и поместила мою запись в таблицу dbo.ASPNetUsers.

Затем я вышел из системы, нажав на Google Authentication для входа в систему. Он успешно прошел аутентификацию, но когда я попытался зарегистрироваться, он продолжает говорить, что мой адрес уже сделан.

enter image description here

Я попытался сделать то же самое для других интернет-сайтах (например, Stackoverflow). Я использовал тот же адрес электронной почты как для Google, так и для Facebook, и веб-сайт знает, что я один и тот же человек, и оба моих логина/заявки связаны, хотя они происходят из разных мест (Google & Facebook).

enter image description here

Я хотел бы иметь эту функцию в моем веб-сайте, и не могли бы вы, пожалуйста, дайте мне знать, как я могу добиться этого.

Теоретически, он должен поместить еще одну строку в 'dbo.AspNetUserLogins' и должен связать один и тот же UserId с несколькими входами.

Нужно ли реализовать собственный метод SignInManager.SignInAsync для достижения этой функции? Или мне не хватает какой-либо конфигурации?

enter image description here

+0

В шаблонах VS вы добавляете другого провайдера, перейдя на страницу «Управление» после входа в систему и добавив этого провайдера, а не путем попыток зарегистрироваться как новый пользователь. Связывание по одному адресу электронной почты недостаточно сильное, так как приложение не может подтвердить, что вы действительно владеете этим адресом. – Tratcher

ответ

1

Вы должны связать свой Facebook внешний вход в свой Google внешнего входа в систему с вашей электронной почты с помощью UserManager.AddLoginAsync, вы не можете зарегистрировать дважды, используя один и тот же Adresse, если вы используете Adresse в качестве логина.
Проверьте образец Identity в репозитории Identity github.

https://github.com/aspnet/Identity/blob/dev/samples/IdentitySample.Mvc/Controllers/ManageController.cs

Для того, чтобы связать внешний вход для пользователя, контроллер Manae подвергать методы LinkLogin и LinkLoginCallback
LinkLogin запрашивает перенаправление внешнего поставщика входа в систему, чтобы связать вход для текущего пользователя
LinkLoginCallback обрабатывает поставщика ответ

// 
    // POST: /Manage/LinkLogin 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public IActionResult LinkLogin(string provider) 
    { 
     // Request a redirect to the external login provider to link a login for the current user 
     var redirectUrl = Url.Action("LinkLoginCallback", "Manage"); 
     var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, _userManager.GetUserId(User)); 
     return Challenge(properties, provider); 
    } 

    // 
    // GET: /Manage/LinkLoginCallback 
    [HttpGet] 
    public async Task<ActionResult> LinkLoginCallback() 
    { 
     var user = await GetCurrentUserAsync(); 
     if (user == null) 
     { 
      return View("Error"); 
     } 
     var info = await _signInManager.GetExternalLoginInfoAsync(await _userManager.GetUserIdAsync(user)); 
     if (info == null) 
     { 
      return RedirectToAction(nameof(ManageLogins), new { Message = ManageMessageId.Error }); 
     } 
     var result = await _userManager.AddLoginAsync(user, info); 
     var message = result.Succeeded ? ManageMessageId.AddLoginSuccess : ManageMessageId.Error; 
     return RedirectToAction(nameof(ManageLogins), new { Message = message }); 
    } 
+0

Вы можете дать более подробную информацию? Как связать FB и учетную запись Google с помощью AddLoginAsync? – Alexan

+0

@Alexan Я обновил ответ, это более ясный код –

+0

выглядит так же, как у меня в ManageController. Что именно я должен изменить? – Alexan

Смежные вопросы