我们一直在与多租户申请斗争。 这是一个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;
}
我们不知道这是否是正确的方法,因为网上有很多信息。
感谢。
答案 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");
}
}
}