0

我們一直在與多租戶應用進行鬥爭。 這是一個ASP MVC EF6 Code First Web應用程序。ASP MVC EF6代碼優先多租戶得到租戶ID

我們初始化租戶的名單在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

根據我的經驗,HTTP上下文中租戶Id的持久性是不正確的,因爲在某些情況下,HTTP上下文變爲空。

您可以嘗試從當前委託人的索賠中獲得租戶Id。使用從權利要求中讀取的租戶標識屬性創建靜態類更加可靠。假設你正在使用owin管道,這應該很容易做到。你可以看看參考示例應用程序從GitHub here

它看起來像下面的框,

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