具有ASP.NET标识的实体框架多租户

时间:2015-06-23 12:12:38

标签: c# asp.net-mvc entity-framework asp.net-identity multi-tenant

如果这与其他内容重复,请提前道歉 - 我看过许多帖子围绕类似的问题但没有解决我的具体情况。

我们正在做的是使用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. 将Roles和UserRoles表移动到每个租户数据库,或
  2. 以某种方式覆盖默认行为以填充我自己的声明
  3. 我计划一旦用户提名他们想要使用哪个租户,该信息将作为声明存储在cookie中,并在每个请求中读出以定位正确的数据库。

1 个答案:

答案 0 :(得分:0)

我认为您需要抛出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标识表结构的限制。