簡體   English   中英

具有ASP.NET身份的實體框架多租戶

[英]Entity Framework Multi-Tenancy with ASP.NET Identity

如果這是其他內容的重復,請提前道歉-我看到很多帖子都圍繞着類似的問題,但沒有任何內容可以解決我的具體情況。

我們正在做的是使用ASP.NET MVC 5和Identity Framework以及Entity Framework生產SaaS系統。 由於安全性要求,我們需要使用多數據庫模型。 用戶將通過一個“帳戶”主數據庫進行身份驗證,該數據庫將其鏈接到一個租戶,然后我們將在運行時修改連接字符串,以便DbContext可以為該租戶定位正確的數據庫。 到目前為止,我對此表示滿意。

棘手的部分是每個用戶都可以鏈接到多個租約,並且可以在它們之間切換。 這意味着,根據每個租戶中分配的權限,每個租戶將需要一組不同的角色/聲明。 我不確定的是如何將dbo.AspNetRolesdbo.AspNetUserRoles表移動到租戶數據庫中,即使這是正確的策略也是如此。

數據庫結構(建議)

Accounts   <--all users in here
SL3-1111   <--DB for tenant ID #1111
SL3-2222   <--DB for tenant ID #2222

我想我需要:

  1. 將“角色”和“用戶角色”表移至每個租戶數據庫,或
  2. 以某種方式覆蓋默認行為以填充我自己的聲明

我計划一旦用戶指定了他們希望使用的租戶,該信息將作為聲明存儲在cookie中,並隨每個請求以正確的數據庫為對象進行讀取。

我認為您需要扔掉大部分ASP.NET Identity並使用OWIN自己制作。 首先,OWIN中間件尤其是ASP.NET MVC可以與您創建的任何ClaimsIdentity一起使用。

var identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));
// add any other claims here

var context = HttpContext.Current.GetOwinContext();
var authentication = context.Authentication;
var properties = new AuthenticationProperties();
properties.IsPersistent = true;

authentication.SignIn(properties, identity);

將此添加到您的Application_Start配置代碼中:

AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;

用戶登錄后,可以用所需的任何聲明填充ClaimsIdentity,並且可以擁有適合您的應用程序的任何數據庫結構,而沒有默認ASP.NET Identity表結構的限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM