ASP.NET 具有单个回调网址的多租户应用的核心 Google 身份验证?



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

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

它运行良好,除了谷歌不支持通配符回调网址。因此,每次添加新租户时,我都必须使用新的回调 URL 配置我的 Google 应用以反映新主机:tenant1.example.com/signin-googletenant2.example.com、...等。

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

以前有人这样做过吗?有人认为这种方法有问题吗?

您说得对,身份验证系统不允许您进一步修改 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>();

最新更新