【问题标题】:Multi Tenant MVC Application Sometimes Provides Wrong Tenant多租户 MVC 应用程序有时会提供错误的租户
【发布时间】:2015-01-09 02:34:30
【问题描述】:

我有一个支持多个租户的标准 ASP.NET MVC 应用程序。代码已经投入生产几个月了,我发现在完全随机的时间间隔(永远无法重现问题),有时会为另一个租户获取来自错误租户的数据。

例如,Tenant1 登录,但他们从我们的 Web 应用程序收到一个 cookie,其中包含来自 Tenant2 数据库的信息!

我的基本控制器使用以下代码提取所需的租户:

    protected override void Initialize(RequestContext requestContext)
    {
        string tenant = String.Empty;

        tenant = requestContext.Request.Headers["Host"].Split(':')[0];
        if (tenant.Contains(".")) tenant = tenant.Substring(0, tenant.IndexOf("."));

        base.Initialize(requestContext);
    }

这适用于 99.9% 的情况。所以我无法想象这是问题所在。我唯一能确定哪里可能出错的地方是当我将值存储在自定义 cookie 中时。我必须使用 HttpContext.Current 才能访问当前请求并提取租户。

任何人都可以在上面的代码中看到任何内容,或者在我对 HttpContext.Current 的使用中看到任何可能导致为任何特定请求提取错误租户的内容吗?

问题可能发生在数据层附近,但租户总是被传递到数据层,以便将查询定向到正确的数据库,所以我确信有时会返回错误的租户。

非常感谢, 加里

【问题讨论】:

  • 如何分析 SQL Server 查询。然后识别调用此查询的 DAL / 服务。这可以帮助追查源头
  • 仅作记录;我希望您对用户所属的租户进行更多检查,而不是对标头变量进行检查...这听起来确实像是一个等待被利用的安全漏洞... :)
  • 嗨,Noocyte。你在这方面有什么建议吗?否则如何根据入站 URL 请求确定租户?以及究竟如何有人能够操纵它?

标签: c# asp.net-mvc-4 multi-tenant


【解决方案1】:

这原来是实体框架中的一个错误。本质上,如果发生迁移或长时间运行的任务,连接字符串的缓存允许错误的连接为另一个传入线程提供服务!

确保您已更新到 6.1.2 或更高版本。

干杯, 加里

【讨论】:

  • 如何从 url 解析租户?我不知道在哪里保存租户 url,以便它在应用程序的其余部分中可用。
  • @Picflight:我所有的控制器都继承自 BaseController。我重写了 Initialize 方法,并在其中在 BaseController 上设置了一个公共属性,看起来像这样:string domain = String.Empty; domain = httpContextBase.Request.Headers["Host"].Split(':')[0]; if (domain.Contains(".")) domain = domain.Substring(0, domain.IndexOf("."));
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多