用于具有单个回调 url 的多租户应用程序的 ASP.NET Core Google Auth?

Posted

技术标签:

【中文标题】用于具有单个回调 url 的多租户应用程序的 ASP.NET Core Google Auth?【英文标题】:ASP.NET Core Google Auth for multi-tenant apps with single callback url? 【发布时间】:2019-12-26 23:43:24 【问题描述】:

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

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

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

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

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

【问题讨论】:

似乎可行;你打算在反向代理级别重写它吗? (nginx?)我担心从tenant1到tenant2的重定向攻击;但也许我想多了。顺便说一句,Stack Overflow 使用 stackauth——一个集中的站点,在那里进行身份验证,然后他们将你重定向回来——就好像它是他们自己的 OAuth 提供者一样。 我们经常使用与 OAuth 流交互的完全独立的登录应用程序,然后在协商后使用内部令牌重定向到实际应用程序。我不能说我已经将它与多租户应用程序一起使用,但这种模式对我们来说非常有效,可以让我们的应用程序与角色/权限存储实现分离。 我喜欢单独应用程序的想法,但这也增加了托管和部署的复杂性。现在,我只需要担心一个应用程序。我想最终我将不得不添加这个其他应用程序,也许使用 IdentityServer4 联合网关。 【参考方案1】:

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

【讨论】:

我已经修改了重定向 URL,它工作正常。但是使用自定义重定向网址登录后如何返回原始服务器? 嗨,我如何通过属性传递当前子域...无法访问 HttpContext @Tushar 如果您从GoogleHandler 继承,您可以通过Request 属性访问请求对象。 快速问题:我尝试像这样设置状态值:properties.Items.Add("subdomain", "abc");但是返回 url 中的返回状态值是加密的。我如何访问它? @Tushar 这取决于您想要访问状态的哪里。通常,属性将不受保护,例如进入身份验证过程中使用的AuthenticationTicket

以上是关于用于具有单个回调 url 的多租户应用程序的 ASP.NET Core Google Auth?的主要内容,如果未能解决你的问题,请参考以下文章

oauth1 中的多租户身份验证问题

Google Analytics / Piwik + MVC 的多租户支持?

PWA-Android,iOS,MacOS,Windows Store,Chrome添加到主屏幕-具有多个域的多租户应用程序出现问题

使用 spring-data-elasticsearch 的多租户

使用 .NET 和 IIS 的多租户 SaaS

在 Laravel 4.2 Artisan 命令中更改应用程序 url