AspNetCore Security: заставьте социальные логины получать ключи во время запроса вместо запуска - PullRequest
0 голосов
/ 14 мая 2019

Я использую знакомые сторонние логины в моем приложении, как это при запуске:

            var authenticationBuilder = services.AddAuthentication().AddCookie(...);                
            if (settings.UseGoogleLogin)
            authenticationBuilder.AddGoogle(x =>
                {
                    x.ClientId = settings.GoogleClientId;
                    x.ClientSecret = settings.GoogleClientSecret;
                    x.SignInScheme = settings.MyScheme;
                });

Теперь мне нужно адаптировать это для работы мультитенантным способом, то есть я не хочу присваивать эти значения при запуске приложения, а скорее во время выполнения. Я не спрашиваю о том, как сделать мультитенантность в широком смысле ... в этом случае я могу определить его по маршруту, субдомену или как-то еще и спрятать этот контекст клиента где-то в конвейере запросов. Я спрашиваю, как я могу использовать существующую магию безопасности для Google, Facebook и т. Д., Чтобы получить эти параметры во время запроса, а не устанавливать их один раз при запуске. Исходный код не показывает мне сразу очевидный способ сделать это.

РЕДАКТИРОВАТЬ: я все ближе. Я обнаружил, что назначение нового встроенного объекта OAuthEvents будет происходить во время процесса аутентификации, но это создает условие гонки, когда идентификатор и секретный ключ уже были включены для полезной нагрузки в Google, и поэтому назначение не используется до следующего попытка авторизации:

                // this doesn't work, but it's closer...
                authenticationBuilder.AddGoogle(x =>
                {
                    x.Events = new Microsoft.AspNetCore.Authentication.OAuth.OAuthEvents
                    {
                        OnRedirectToAuthorizationEndpoint = context =>
                        {
                            // these values won't be used until next auth attempt
                            x.ClientId = "newid";
                            x.ClientSecret = "newsecret";
                            context.Response.Redirect(context.RedirectUri);
                            return System.Threading.Tasks.Task.CompletedTask;
                        }
                    };
                    x.ClientId = "placeholder";
                    x.ClientSecret = "placeholder";
                    x.SignInScheme = PopForumsAuthorizationDefaults.MyScheme;

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