Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多租户MVC应用程序有时提供错误的租户_C#_Asp.net Mvc 4_Multi Tenant - Fatal编程技术网

C# 多租户MVC应用程序有时提供错误的租户

C# 多租户MVC应用程序有时提供错误的租户,c#,asp.net-mvc-4,multi-tenant,C#,Asp.net Mvc 4,Multi Tenant,我有一个支持多租户的标准ASP.NET MVC应用程序。这段代码已经在生产中几个月了,我发现在完全随机的时间间隔内(永远无法重现这个问题),有时会从错误的租户那里为另一个租户获取数据 例如,Tenant1登录,但他们从我们的web应用程序收到一个cookie,其中包含来自Tenant2数据库的信息 My base Controller使用以下代码提取所需的租户: protected override void Initialize(RequestContext requestContex

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

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

My base Controller使用以下代码提取所需的租户:

    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中,有人能看到任何可能导致为任何特定请求提取错误租户的内容吗

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

非常感谢,,
Gary

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

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

干杯,
Gary

如何分析SQL Server查询。然后识别调用此查询的DAL/服务。这有助于跟踪记录的来源;我希望您对用户所属租户的检查比头变量多。。。这听起来像是一个等待被利用的安全漏洞…:)你好,努赛特。在这方面你有什么建议吗?否则如何根据入站URL请求确定租户?那么,人们到底是如何操作的呢?你是如何从url解析租户的?我无法确定在何处保存租户url,以便在应用程序的其余部分中可用。@Picflight:我的所有控制器都从BaseController继承。我重写了Initialize方法,在那里我在BaseController上设置了一个公共属性,如下所示:string domain=string.Empty;domain=httpContextBase.Request.Headers[“Host”].Split(“:”)[0];如果(domain.Contains(“.”)domain=domain.Substring(0,domain.IndexOf(“.”));