Подключите токены OAuth к пользователю - PullRequest
0 голосов
/ 21 июня 2020

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

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

Я регистрирую свою полосовую службу следующим образом:

services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})    
.AddOAuth<OAuthOptions, StripeConnectOAuthHandler<OAuthOptions>>(
    StripeConnectDefaults.AuthenticationScheme, options => {
    options.SaveTokens = true;
    options.ClientId = Configuration["Stripe:ClientId"];
    options.ClientSecret = Configuration["Stripe:ClientSecret"];
    options.TokenEndpoint = StripeConnectDefaults.TokenEndpoint;
    options.AuthorizationEndpoint = StripeConnectDefaults.AuthorizationEndpoint;
    options.UserInformationEndpoint = StripeConnectDefaults.UserInformationEndpoint;
    options.Scope.Add("read_write");
    options.CallbackPath = new PathString("/signin-stripeconnect");
    //...
});

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

Поэтому я хотел бы добавить дополнительные способы входа в систему, но мне нужно связать этих пользователей вместе

app.UseGoogleAuthentication(new GoogleOptions()
{
    AuthenticationScheme = "Google",
    DisplayName = "Google",
    SignInScheme = COOKIE_AUTH,
    ClientId = "sdlfkjgsdlkfjgsdf-sdfadsfasdf.apps.googleusercontent.com",
    ClientSecret = "myClientSecretBase64==",    
});

Однако, если я сделаю это, мне понадобится способ связать мой логин Google и мой логин учетной записи Stripe. Раньше я использовал IdentityServer4. Обычно токен-серверы получают через API. Так что размещение токен-сервера кажется излишним, если его будет использовать только одно приложение.

Есть ли простой способ разрешить аутентификацию, при этом давая возможность подключаться к внешним API, таким как stripe?

Примечание: Если для решения требуется IdentityServer 4, я не возражаю, я просто предпочел бы не размещать 2 отдельных приложения

1 Ответ

0 голосов
/ 22 июня 2020

Хм, похоже, это вызвано моим неправильным представлением об Идентичности. Идентификация уже одного пользователя, чтобы иметь разные методы входа в систему. В моем контроллере аутентификации я исправил это, присоединив внешний логин к существующему пользователю, если он уже существует.

var user = await this._userManager.FindByEmailAsync(email);
if(null == user)
{
    user = await this.CreateIdentityUser(info, email);
}

var addLoginResult = await _userManager.AddLoginAsync(user, info);

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

...