ASP.NET 核心 Google 对具有单一回调的多租户应用程序进行身份验证 url?

ASP.NET Core Google Auth for multi-tenant apps with single callback url?

我正在构建一个多租户 asp.net 核心应用程序,其中租户是按主机名选择的。所以 tenant1.example.comtenant2.example.com、...等等。

此外,我正在使用 Google 身份验证,使用 asp.net 核心中的默认 Google 身份验证处理程序 services.AddAuthentication(...).AddGoogle(...)

它工作得很好,除了 Google 不支持通配符回调 URLs。因此,每次我添加新租户时,我都必须使用新回调 URL 配置我的 Google 应用程序以反映新主机:tenant1.example.com/signin-googletenant2.example.com、... , 等等。

asp.net 核心 Google 处理程序允许您指定回调路径,但不能指定 URL。我计划覆盖处理程序以使回调 URL 始终转到托管在裸域 example.com/redirect-google 上的重定向器 url(我会小心打开重定向),并让重定向到相应的子域以完成身份验证。

以前有人做过吗?有人发现这种方法有问题吗?

您是对的,身份验证系统不允许您进一步修改 OAuth 重定向 URI 的主机。这样做主要是为了使系统主机名不可知,这是整个框架中使用的常见模式(基本上每 URL 代都基于当前上下文)。

作为解决方法,您可以为 Google 方案设置您自己的身份验证处理程序。您实际上可以继承 GoogleHandler 并覆盖 BuildChallengeUrl。调用该方法以实际构建身份验证提供程序的质询 URI。它通过了 redirectUrl,这是 OAuthHandler 的回调路由(您不能更改其主机名)。

因此,通过重写该方法,您可以简单地更改通过的 redirectUrl 并将其替换为您要使用的通用 URL。

protected override string BuildChallengeUrl(AuthenticationProperties properties, string redirectUri)
{
    return base.BuildChallengeUrl(properties, "https://example.com/redirect-google");
}

执行此操作时,您只需替换 DI 配置中的 GoogleHandler

services.AddTransient<GoogleHandler, ReplacedGoogleHandler>();