Обработка претензий с внешним провайдером - PullRequest
0 голосов
/ 06 июня 2018

Я давний разработчик .NET Framework / WebForms и перехожу на Core (2.1) для нового проекта.У меня есть готовые основы, с решением VS, включающим проект DAL и проект веб-приложения (в MVC).Я использую Core Identity, и добавил по-умолчанию файлы идентификации личности.Все нормально, с регистрацией / аутентификацией в Facebook.Пока что я не совсем понимаю, как работает схема аутентификации, но я начинаю собирать ее воедино.

Одна вещь, которая мне достается - и что-то, чего я не могу найтилюбая понятная и понятная документация - это то, как обрабатывать данные о претензиях, поступающие из FacebookЯ получаю, что все, что вы запрашиваете, в настройке для метода AddAuthentication(), сохраняется в cookie-файле клиента, и вы можете получить его таким образом.Но я хочу продолжить и сохранить эту информацию в таблице IdentityClaims.

В Startup.cs у меня есть AddAuthentication(), настроенная так:

services.AddAuthentication().AddFacebook(options =>
{
    options.AppId = "XXXXXXXXXX";
    options.AppSecret = "XXXXXXXXXX";
    options.SaveTokens = true;
    options.Scope.Add("public_profile");
    options.Scope.Add("email");
    options.Fields.Add("name");
    options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
});

Честно говоря, я не совсем знаю, правильно ли я настроил эту систему, чтобы запросить требование "имя", которое будет включено в запрос ... Но даже если это так, я должен признать, что яна самом деле не знаю, что с этим делать, послесловия.

Я предполагаю, что что-то должно произойти в методе OnPostConfirmationAsync() файла ExternalLogin.cshtml.cs, в папке \ Identity \ Pages \ Account,Вероятно, что-то вроде:

UserManager.AddClaimAsync(user, ...something...);

Но я действительно не знаю, и кажется, что должен быть лучший путь.Например: есть ли способ настроить параметры таким образом, чтобы при вызове метода UserManager.CreateAsync () автоматически сохранялись и утверждения?

Это все очень элементарные вопросы, и я разочарован тем, что не былв состоянии видеть это ясно.Все, что мне нужно, это хороший пример для работы, и я уверен, что получу его.Пока что все остальное кажется довольно простым.

1 Ответ

0 голосов
/ 07 июня 2018

Удивлен тем, как быстро после публикации я нашел ответ на свой вопрос, а также насколько он элементарен на самом деле.

Я буду честен и скажу, что я не совсем и полностью не понял, чтопродолжал со всеми различными настройками параметров, относительно настройки входа внешнего провайдера (в данном случае, Facebook).

Как выясняется, нет необходимости специально называть «имя»поле, которое будет добавлено (это часть области public_profile).Также не обязательно выгодно отображать тип заявки на более читаемое имя, либо на этом уровне.Я думаю, что это будет необходимо только в том случае, если вы пытаетесь настроить внешний вход в систему для работы с какой-либо существующей функциональностью, которая ожидает определенного значения, и вы не можете изменить код.

В любом случае, если вы используете внешнего провайдера, как только вы получите ответ и получите экземпляры SignInManager и UserManager, вы можете просто:

var info = [SignInManager instance].GetExternalLoginInfoAsync();
[UserManager instance].AddClaimsAsync([IdentityUser instance], info.Principal.Claims);

Это будет выбрасывать каждыйединая заявка получена от внешнего поставщика в таблицу заявок пользователей.Я получаю что-то немного более сложное, чем то, что включает в себя прохождение всех требований, чтобы получить желаемые.Это довольно просто сделать, когда вы поймете (как я теперь понимаю), что встроенный тип System.Security.Claims.ClaimTypes содержит сопоставления с полными именами схем для всех распространенных типов утверждений.Так что просто сортируйте те, которые вы хотите, и добавляйте их, как считаете нужным.Просто.

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