ASP MVC EF6 Code第一个多租户获得租户ID

时间:2016-12-09 12:28:20

标签: entity-framework multi-tenant asp.net-mvc-custom-filter

我们一直在与多租户申请斗争。 这是一个ASP MVC EF6 Code First Web应用程序。

我们在Application_Start中初始化一个租户列表,获取一对值:

Host
TenantId

因此,我们可以将任何主机与一个TenantId相关联,并将该列表存储在缓存中。

我们已配置自定义过滤器以获取当前租户。

public class TenantActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Items.Add("TenantId", GetCurrentTenant(filterContext.HttpContext.Request.Url.Host));

        base.OnActionExecuting(filterContext);
    }
}

GetCurrentTenant函数只访问缓存中的列表,并根据传递的主机获取当前列表。

将当前租户存储在上下文中的项目中是否正确?

之后,我们创建了一个拦截器来获取任何查询并添加一个过滤器来过滤TenantId。这样做并且运行良好,我们只需要从上下文中添加tenantId:

我们遇到的问题是我们为每个请求获取TenantId。

if (HttpContext.Current.CurrentHandler == null) return;
var clientId = Convert.ToInt32(HttpContext.Current.Items["ClientId"]);

        foreach (DbParameter param in command.Parameters)
        {
            if (param.ParameterName != TenantAwareAttribute.TenantIdFilterParameterName)
                continue;
            param.Value = clientId;
        }

我们不知道这是否是正确的方法,因为网上有很多信息。

感谢。

1 个答案:

答案 0 :(得分:0)

根据我的经验,HTTP上下文中租户Id的持久性不正确,因为在某些情况下,HTTP上下文变为null。

您可以尝试从当前委托人的索赔中获取租户ID。创建具有租户标识符属性的静态类,该属性从声明和提供中读取更可靠。假设您正在使用owin管道,这应该很容易。您可以从github here

查看参考示例应用程序

看起来像下面的块,

public static class UserContext
{
   public static string TenantId
   {
       get
       {
           return Threading.Thread.CurrentPrincipal.FindFirst("tenantid");
       }
   }
}