Я использую знакомые сторонние логины в моем приложении, как это при запуске:
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;
});