asp.net-mvc - 来自 google 控制台的动态重定向 url - oAuth

标签 asp.net-mvc google-api google-oauth owin multi-tenant

我创建了一个 MVC/API 项目来启用外部身份验证,并且在我的本地主机 URL 上运行良好。但是,我需要实现以下目标。

  1. 我支持 Multi-Tenancy (相同的应用服务和不同的数据库),因此每个租户必须根据 MVC url 中的自定义参数连接不同的数据库 例如:https://localhost/tenant1 、.../tenant2、.../tenant3 等(此时不使用单独的子域)

  2. 我不确定 Google 控制台是否支持通配符 url 作为返回 ur,并且不确定如何在 MVC 代码中实现这一点(例如: http://localhost/ * 或 {0} .. 类似的东西。(所以动态输入参数将从google返回)

我正在阅读并尝试一些解决方案。一旦我得到完整的解决方案,将在这里更新答案。同时,如果有人有任何建议,请帮助我。

更新1:

我已更新源代码如下:

在重定向到外部登录之前创建 session 对象

System.Web.HttpContext.Current.Session["Tenant"] = "tenantname";

回调后读取租户详细信息并保存在 session 中,以便根据租户名称进行后续数据库调用

public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {
        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }

        if (System.Web.HttpContext.Current.Session["Tenant"] != null)
        {
            string sessionObj = System.Web.HttpContext.Current.Session["Tenant"] as String;
        }

最佳答案

这是一个常见的需求,并且很容易解决。有两个组件。

首先,无论您的应用程序位于多个 URL 中的哪一个(myapp.com/tenant1、/tenant2 等),您都有一个单个重定向 URL(例如 myapp.com/oauthredirect)。

其次,当启动 OAuth dance ( https://developers.google.com/identity/protocols/OAuth2WebServer#redirecting ) 时,您可以指定一个 state 参数,该参数将传递到您的 oauthredirect 例程中(例如 state=tenant1)。完成用户注册任务后,您可以使用它创建返回到相应网站 URL 的重定向。

在开发者控制台中指定重定向 URL 时要小心。它们必须与实际 URL 逐个字符匹配。因此,例如,您需要指定 http://myapp.com/oauthredirecthttps://myapp.com/oauthredirect。我一直发现在 /etc/hosts (或 Windows 等效项)中创建本地条目非常有用,因此您的本地主机也可以通过例如进行解析。 http://test.myapp.com

关于asp.net-mvc - 来自 google 控制台的动态重定向 url - oAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43055127/

相关文章:

python - 无效请求状态 : oauth2 flask

javascript - Google API 使用 JavaScript 中的 id_token 从 Java 访问 Gmail

javascript - Jqueryui图像引用没有错误但图像不显示

asp.net-mvc - 日期格式不正确的 MVC DateTime 绑定(bind)

javascript - 谷歌图书 API

java - Google 云端硬盘撤销共享文件的权限

authentication - 如何在没有 Google Dll 的情况下验证 Gmail API

asp.net - 如何从 ASP.NET MVC 中的表单例份验证中拦截 401?

c# - 确保 Controller 有一个无参数的公共(public)构造函数

android - 在 Stripe 付款上显示每小时价格而不是存款价格