繁体   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