0

TL;博士

如何更改 redirect_url 端点的行为?我想处理显然不是 JWT 的 SAML。

所有血腥的细节

你可能见过这样的代码

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 auth 服务返回的令牌。

显而易见的下一步是克隆 aspnet/Security 存储库,将示例项目链接到它并逐步完成魔法,但它自然而然地针对每个人1拥有的 Core 2.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);
}

这是一个非常多的代码要涉水。谁能告诉我重定向处理程序端点是在哪里以及如何生成的,以及如何为其提供替换行为?

OAuthHandler.cs 的第 89 行看起来很有希望

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

因为这似乎是将代码交换为令牌的逻辑并且它是可覆盖的,但是很难确定我什么时候不能运行它。


  1. 显然,“每个人”是指 aspnetcore 开发团队中的每个人。
4

0 回答 0