使用单个回调URL的多租户应用的ASP.NET Core Google Auth?

时间:2019-08-21 16:37:28

标签: asp.net-core oauth asp.net-identity google-oauth

我正在构建一个多租户asp.net核心应用程序,该程序基于主机名来选择租户。 tenant1.example.comtenant2.example.com,...,依此类推。

此外,我正在使用asp.net核心services.AddAuthentication(...).AddGoogle(...)

中的默认Google身份验证处理程序使用Google身份验证

除了Google不支持通配符回调URL之外,它的运行状况都很好。因此,每次添加新租户时,都必须为Google应用配置新的回调URL,以反映新的主机:tenant1.example.com/signin-googletenant2.example.com等。

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

有人做过吗?有人看到这种方法有问题吗?

1 个答案:

答案 0 :(得分:2)

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