Аутентификация внешнего входа в ядре Asp.net 2.1 - PullRequest
0 голосов
/ 04 сентября 2018

Основное приложение Asp.Net, я интегрировал аутентификацию при входе в систему третьих лиц, «Твиттер, Facebook» и т. Д., Однако проблема заключается в том, что «Мой контекст идентификации пользователя имеет имя и фамилию», что необходимо, но когда я пытаюсь аутентифицироваться через внешних провайдеров у него не будет возможности добавить эти поля. Как я могу добавить эти поля с внешними провайдерами входа в систему, чтобы моя база данных имела имя и фамилию вместе с учетными данными своих внешних провайдеров.

Спасибо

1 Ответ

0 голосов
/ 05 октября 2018

Хорошо, пока не будет предоставлен код, ответ будет "все зависит", но я постараюсь. Вчера я провел подобное исследование, так что это довольно свежее знание. В качестве предварительного условия я создал новый проект Razor Pages и прошел эти уроки для различных провайдеров .

Во-первых, разные поставщики предоставят вам разные данные. Например, без какой-либо дополнительной настройки вы будете получать имена и фамилии только от Facebook и Google. Чтобы получить имя из Twitter, вам нужно вручную добавить претензию

.AddTwitter(options =>
            {
                options.ConsumerKey = Configuration["Authentication:Twitter:ConsumerKey"];
                options.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
                options.RetrieveUserDetails = true;
                options.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "name");
            })

или как-то обработать событие CreatingTicket. Проблемы не остановятся здесь. В Твиттере они не различают имена и фамилии, поэтому это просто Имя. И глазурь на торте: в Твиттере и Google вы можете стереть свое имя, чтобы в этом случае вы не получили никаких данных.

Во-вторых, хранение данных. Я думаю, что можно просто следовать подходу, предложенному в уже упомянутой статье , и сохранять заявки и / или расширять класс IdentityUser, который, как я полагаю, является вашим случаем. Я положил вызов обновления пользователей, где они сохранили претензии, в OnPostConfirmationAsync:

if (result.Succeeded) {   
  // Save claims. This will populate AspNetUserClaims table
  await _userManager.AddClaimsAsync(user, 
  new []
  {
    info.Principal.FindFirst(ClaimTypes.GivenName),
    info.Principal.FindFirst(ClaimTypes.Surname)
  });

  // AND/OR save user. This will populate the AspNetUsers table
  user.FirstName = info.Principal.FindFirst(ClaimTypes.GivenName).Value;
  user.LastName = info.Principal.FindFirst(ClaimTypes.Surname).Value;
  await _userManager.UpdateAsync(user);
  ...
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...