首页 > 解决方案 > 如何将自定义域名与 abp 框架一起使用

问题描述

我确信这不是什么新鲜事,但也许我不知道输入谷歌的正确方法......基本上我的目标是使用 abp.io 创建一个多租户应用程序,并满足以下要求。

  1. 新用户注册为租户。
  2. 然后,用户将他们的域 dns 记录指向我的应用程序。
  3. 用户输入要用于其租户的自定义域。
  4. 用户登录和页面将在他们选择的域上解析。

例如,我的应用程序名称托管在 winemaker.com 上。制作葡萄酒的人想要使用我的应用程序并使用 JoesFootWine 的租户名称 (winemaker.com/JoesFootWine) 进行注册...但是 Joe 已经拥有域 JoesFootWine.com 并希望将其用于此应用程序。我需要为 Joe 设置一种方法来轻松设置他们的租户,以便在 JoesFootWine.com 上解决 winemaker.com/JoesFootWine。

在 JoesFootWine.com/{login-route} 上设置登录页面并且租户已经设置且不可更改,这将是一个额外的好处,但不是硬性要求。

标签: aspnetboilerplateabp

解决方案


这里最棘手的事情是根据域解析租户。我之前使用 ABP 完成过此操作,但不记得所有细节,但您可以使用 ITenantResolveContributor 接口创建自己的自定义租户解析器。然后可以使用您的解析器代替默认的解析器。

文档在这里https://docs.abp.io/en/abp/latest/Multi-Tenancy

在您的自定义租户解析器中,您需要获取当前正在使用的域,然后使用该域在数据库中查找租户。您可以将它们存储在单独的表中,以防您希望允许租户拥有多个域名等,或者它可能只是租户表中的一列。与 MVC 形式或其他东西相比,从内存中从 Aspnet 核心中的 api 调用获取域有点棘手。

如果它是您需要解析租户的 api 调用,那么我认为您应该能够从推荐人那里获取域

其实我只是挖了这个。我认为很可能有更好的方法来做到这一点,但希望它可以帮助你开始。

        //first try the referrer to see if we can resolve the tenant
        //this will be the referrer from the client calling the api
        var referer = httpContext.Request.Headers.Any(x => x.Key.Equals("referer", StringComparison.InvariantCultureIgnoreCase)) ? httpContext.Request.Headers["Referer"].ToString() : "";
        if (!string.IsNullOrEmpty(referer))
        {
            Uri myUri = new Uri(referer);
            referer = myUri.Host;
        }

        //if no referrer then resort to the host
        //currently this will not change based on tenant
        //but could be an option with some more customization instead 
        //of relying on referrer. 
        if (string.IsNullOrEmpty(referer))
            referer = httpContext.Request.Host.Host;

我还记得在 Angular 路由或其他东西的 UI 方面我不需要做任何额外的事情。现在真的想不起来一年多以前的样子了。


推荐阅读