Изменить обработчик перенаправления Oauth AspNetCore2

TL;DR

Как изменить поведение конечной точки redirect_url? Я хочу обработать SAML, который явно не является JWT.

Все кровавые детали

Вы, наверное, видели такой код

Microsoft.AspNetCore.Authentication.AuthenticationBuilder authBuilder;
authBuilder = services.AddAuthentication();
...
authBuilder.AddGitHub(gitHubOptions =>
{
  gitHubOptions.AppId = clientId;
  gitHubOptions.AppSecret = clientSecret;
});

Порывшись в исходном коде провайдера GitHub, мы находим, что AddGitHub это метод расширения, который выглядит следующим образом

public static AuthenticationBuilder AddGitHub(
    [NotNull] this AuthenticationBuilder builder,
    [NotNull] Action<GitHubAuthenticationOptions> configuration)
{
    return builder.AddGitHub(GitHubAuthenticationDefaults.AuthenticationScheme, configuration);
}

GitHubAuthenticationDefaults.AuthenticationScheme это просто строковая константа со значением "GitHub". Если вы хотите повторно использовать одного и того же провайдера с несколькими конечными точками аутентификации, вам придется использовать другое имя схемы.

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

public static AuthenticationBuilder AddGitHub(
    [NotNull] this AuthenticationBuilder builder,
    [NotNull] string scheme, [CanBeNull] string caption,
    [NotNull] Action<GitHubAuthenticationOptions> configuration)
{
    return builder.AddOAuth<GitHubAuthenticationOptions, GitHubAuthenticationHandler>(scheme, caption, configuration);
}

DisplayName также по умолчанию "GitHub" и не имеет значения. Конфиг мы поставили выше. Так что на самом деле мы звоним AuthenticationBuilder.AddOAuth с двумя строками и нашим объектом конфигурации.

Этот вызов волшебным образом создает конечную точку перенаправления с именем signin-github который обрабатывает токен, возвращенный службой аутентификации GitHub.

Очевидным следующим шагом является клонирование репозитория aspnet/Security, привязка к нему образца проекта и пошаговое прохождение через магию, но, естественно, он нацелен на Core 2.1, который есть у каждого1.

Больше рыться оказывается это.

public static AuthenticationBuilder AddOAuth<TOptions, THandler>(this AuthenticationBuilder builder, string authenticationScheme, string displayName, Action<TOptions> configureOptions)
    where TOptions : OAuthOptions, new()
    where THandler : OAuthHandler<TOptions>
{
    builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<TOptions>, OAuthPostConfigureOptions<TOptions, THandler>>());
  return builder.AddRemoteScheme<TOptions, THandler>(authenticationScheme, displayName, configureOptions);
}

Это очень много кода, чтобы пройтись. Может кто-нибудь сказать мне, где и как генерируется конечная точка обработчика перенаправления, и как можно обеспечить ее замену?

Строка 89 OAuthHandler.cs выглядит многообещающе

var tokens = await ExchangeCodeAsync(code, BuildRedirectUri(Options.CallbackPath));

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


  1. Под "всеми" я подразумеваю всех в команде разработчиков aspnetcore.

0 ответов

Другие вопросы по тегам