Изменить обработчик перенаправления 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 для токенов, и это может быть переопределено, но очень трудно быть уверенным, когда я не могу запустить его.
- Под "всеми" я подразумеваю всех в команде разработчиков aspnetcore.