【问题标题】:ASP MVC EF6 Code first Multi tenant get tenant idASP MVC EF6 代码优先多租户获取租户ID
【发布时间】:2016-12-09 12:28:19
【问题描述】:

我们一直在与多租户应用程序作斗争。 这是一个 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;
        }

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    根据我的经验,租户 ID 在 HTTP 上下文中的持久性是不对的,因为在某些情况下,HTTP 上下文会变为空。

    您可以尝试从当前委托人的声明中获取租户 ID。使用从声明中读取并给出的租户标识符属性创建静态类更可靠。假设您使用的是 owin 管道,这应该很容易做到。您可以查看来自 github here 的参考示例应用程序

    它看起来像下面的块,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-04
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多