【问题标题】:Autofac MultiTenant - how do I route to a subdomain?Autofac MultiTenant - 我如何路由到子域?
【发布时间】:2012-06-06 16:15:47
【问题描述】:

n00b 在这里。重新提问,因为我没有正确标记它。

我正在尝试利用 Autofac 的 MutliTenant 功能。我从源文件中得到了一个“工作”示例。我已经扫描了文档,但无法弄清楚如何“路由”租户。

目前,我想为基本的 CRUD 应用程序使用单个代码库。 CRUD 应用将被多个不同的站点使用,只专注于为各个站点提供特定服务。

我想最终做到这一点:

  • codebase.website1.com(租户 1)
  • codebase.website2.com(租户 2)
  • codebase.website3.com(租户 3)

有什么想法或参考吗?谢谢。

【问题讨论】:

  • 这个底层 CRUD 应用程序是否会是从不同站点的代码中调用的单个运行实例?如果是这样,它的架构是什么?
  • @MarcL。我在想 IIS 7.0,Win 2008 R2。是的,将由网站 1 或 2 或 3 调用的单个实例。因此,在网站 1 上,将有一个指向 codebase.website1.com 等的链接。但是,每个用户都将根据该网站进行身份验证,以便来自网站 2 的用户 2 无法登录到 codebase.website1.com。我希望这是有道理的。

标签: asp.net-mvc-3 autofac


【解决方案1】:

如果您查看the Autofac multitenant documentation on the wiki,您会注意到您确定租户的方式是实施ITenantIdentificationStrategy。该 wiki 页面上提供了一个示例,展示了如何从请求中的参数(如查询字符串)获取租户。

修改示例以查看请求的其他部分很容易 - 主机名、域名或其他任何内容。

using System;
using System.Web;
using AutofacContrib.Multitenant;

namespace DemoNamespace
{
  public class DomainStrategy : ITenantIdentificationStrategy
  {
    public bool TryIdentifyTenant(out object tenantId)
    {
      tenantId = null;
      try
      {
        var context = HttpContext.Current;
        if(context != null && context.Request != null)
        {
          var site = context.Request.Url.Authority;
          // Here's where you map the site to the tenant ID:
          tenantId = MapTheSiteToTheTenantId(site);
        }
      }
      catch(HttpException)
      {
        // Happens at app startup in IIS 7.0
      }
      return tenantId != null;
    }
  }
}

显然,您需要按摩它才能为您工作。如何进行映射,是否返回 null 作为默认租户 ID,等等。

请注意,如果您基于 HTTP 请求值进行测试,那么只要解决了依赖项并且没有 Web 上下文,您将获得应用程序级别的依赖项,而不是特定于租户的依赖项...因为您将无法识别租户。您会在 catch 块中看到一个小工件 - 如果在应用程序启动时解决了任何依赖项,则不一定存在 Web 上下文,因此当您调用 HttpContext.Current 时 IIS 7.0 会引发 HttpException。你必须测试这样的东西。

此外,如果它是服务调用或昂贵的东西,您还需要考虑租户 ID 映射的缓存策略。每次您解决多租户依赖关系时,都会调用该策略,因此您希望使策略实现尽可能高效。

I would really recommend checking out that documentation. 很长,但那是因为多租户是一个复杂的话题,需要涵盖的内容很多。如果您深入其中,您会找到此类问题的答案。

【讨论】:

  • 特别是我正在查看的代码以及我想知道如何实施该策略的地方(维基特别指出“仅作为示例,不推荐)。虽然我看到你在if 块。我在这方面是 n00b。您是否推荐这种基于域名的策略听起来不错?感谢您的见解。
  • 是的,我现在开始明白了。 :)
  • 不推荐使用查询字符串参数来切换租户。这样做将允许某人更改他们的查询字符串并“成为”不同的租户。使用主机/域名是不同的,因为你不能真正搞砸它并停留在同一个“站点”上——就浏览器而言,你实际上是在其他地方。
  • 重点是,仔细考虑您选择什么作为租户 ID 机制。有人可以将其用作攻击媒介吗?他们不能对主机名做很多事情,但是查询字符串我可以说,让一个表单基于一个简单的查询字符串更改注入不同的验证依赖项(在同一个站点上)。
  • 这些非常好,谢谢。我只是想弄清楚如何做主机/域(再次,这里是 n00b)。我的问题是我对所有事情都想得太多了,因为我在做 autofac 所做的事情的不同形式上所获取的信息量很大。
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2021-11-17
相关资源
最近更新 更多