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));
因为这似乎是将代码交换为令牌的逻辑并且它是可覆盖的,但是很难确定我什么时候不能运行它。
- 显然,“每个人”是指 aspnetcore 开发团队中的每个人。