Получите трафик, возвращенный поставщиками социальных сетей для создания локальной учетной записи в моем веб-приложении .net core 2.2 - PullRequest
0 голосов
/ 27 мая 2019

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

В .net core 2.2 все, кажется, происходит за кулисами, и я не могу понять, как захватывать трафик, когда он возвращается после звонка / me, например, в facebook. Этот скрытый вызов возвращает JSON-ответ, который мое локальное приложение затем сопоставляет с утверждениями, чтобы войти в систему. Это все прекрасно, но я также хочу захватить эти данные и создать учетную запись локального пользователя в моем собственном хранилище данных.

Я вижу, как все это происходит в fiddler, поэтому я знаю, что он все еще выполняет свою работу, я просто не знаю, как подключиться к нему, чтобы извлечь то, что мне нужно на этом этапе во время процесса. Придерживаясь здесь примера с facebook, я подумал, что могу изменить свойство facebookOptions.CallbackPath в моем файле startup.cs, затем добавить этот обратный вызов в качестве принятого обратного вызова в приложении facebook, подключить метод на контроллере, который соответствует этому пути, и получить данные оттуда. Я бы согласился на выполнение остальной части процесса вручную, но все, что он сделал, это переместил закулисную работу, которую ядро ​​.net делает в это «местоположение».

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

Любые рекомендации или предложения будут с благодарностью.

1011 * ТИА *

1 Ответ

0 голосов
/ 27 мая 2019

Я нашел способ сделать это, но я не уверен, является ли это лучшим подходом или нет. Я создал вспомогательный класс со статическим методом, который я вызываю внутри события Options.Events.OnCreatingTicket внутри моей AddAuthentication () внутри startup.cs.

Отсюда я могу перебрать свой список заявок, сохранить пользователя в моем локальном хранилище данных и либо создать, либо обновить информацию о локальном пользователе.

Если это не самый лучший способ справиться с этим, я бы хотел получить лучшее направление.

ТИА

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
                options =>
                {
                    options.LoginPath = new PathString("/account");
                })
            .AddFacebook(facebookOptions =>
                {
                    facebookOptions.AppId = Configuration["Authentication:Facebook:AppId"];
                    facebookOptions.AppSecret = Configuration["Authentication:Facebook:AppSecret"];
                    facebookOptions.CallbackPath = new PathString("/account/facebook");
                    facebookOptions.Events.OnCreatingTicket = ctx =>
                    {
                        ExternalLoginProviderHelper.LoginLocally(ctx.Principal);
                        return Task.CompletedTask;
                    };
                })
            .AddGoogle(options =>
                {
                    options.ClientId = Configuration["Authentication:Google:ClientId"];
                    options.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
                    options.Events.OnCreatingTicket = ctx =>
                    {
                        ExternalLoginProviderHelper.LoginLocally(ctx.Principal);
                        return Task.CompletedTask;
                    };
        });

и мой вспомогательный класс:

public class ExternalLoginProviderHelper
{
    public static void LoginLocally(ClaimsPrincipal claimsPrincipal)
    {
        foreach(Claim claim in claimsPrincipal.Claims)
        {
            // extract the claim information here (ID, Email address, name (surname, given name) etc)
            // make repository call to save information to the datastore and get a local user ID
        }
        // also set other claims for local user id, user type (admin, regular user) etc.
        ClaimsIdentity claimsIdentity = (ClaimsIdentity)claimsPrincipal.Identity;
        claimsIdentity.AddClaim(new Claim("usertype", "admin")); // this is just an example N/V pair
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...