如果这是与其他内容的重复,请提前致歉 - 我看到很多帖子都围绕着类似的问题,但没有解决我的具体情况。
我们正在做的是使用 ASP.NET MVC 5 和 Identity Framework 以及 Entity Framework 生成 SaaS 系统。由于安全要求,我们需要使用多数据库模型。用户将通过主“帐户”数据库进行身份验证,这会将他们链接到租户,然后我们将在运行时修改连接字符串,以便 DbContext 可以为租户定位正确的数据库。到目前为止,我对此没有意见。
棘手的部分是每个用户可能链接到多个租户,并能够在它们之间切换。这意味着他们将需要为每个租户设置不同的角色/声明,具体取决于每个租户中分配的权限。我不确定如何将 dbo.AspNetRoles
和 dbo.AspNetUserRoles
表移动到租户数据库中,或者即使这是正确的策略。
数据库结构(建议)
Accounts <--all users in here
SL3-1111 <--DB for tenant ID #1111
SL3-2222 <--DB for tenant ID #2222
我猜我需要:
- 将 Roles 和 UserRoles 表移动到每个租户数据库,或者
- 以某种方式覆盖默认行为以填充我自己的声明
我计划一旦用户指定了他们希望使用的租户,该信息将作为声明存储在 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 表结构的限制。
关于c# - 具有 ASP.NET 标识的 Entity Framework Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31002494/