【问题标题】:Entity Framework Multi-Tenancy with ASP.NET Identity具有 ASP.NET 标识的实体框架多租户
【发布时间】:2015-06-23 12:12:37
【问题描述】:

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

我们正在做的是使用 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. 以某种方式覆盖默认行为以填充我自己的声明

我计划一旦用户指定了他们希望使用的租户,该信息将作为声明存储在 cookie 中,并在每次请求时读出以定位正确的数据库。

【问题讨论】:

  • 您应该有一个元数据数据库,其中包含用户的租户及其角色映射。仅租户的实际数据[业务数据]可以进入单独的数据库

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


【解决方案1】:

我认为您需要放弃大部分 ASP.NET 身份并使用 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 表结构的限制。

【讨论】:

  • 感谢您的回答,我怀疑可能是这种情况。您发布的代码,这是否避免使用 Identity 但仍允许在 POST 表单上使用 AntiForgeryToken()
  • 是的,AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier; 是它的工作原理。
  • @AlexPolyankin 我有一个类似的问题,但对我来说,当前租户由子域(即tenant1.site.com)确定。我怎样才能把这些联系在一起?
  • @Shimmy 您可以将租户添加到用户声明中。如果您有多个数据库,您可能应该为此使用一个共享数据库供用户帐户使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2018-04-06
相关资源
最近更新 更多