c# - 具有 ASP.NET 标识的 Entity Framework Multi-Tenancy

标签 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. 以某种方式覆盖默认行为以填充我自己的声明

我计划一旦用户指定了他们希望使用的租户,该信息将作为声明存储在 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/

相关文章:

c# - C# List<char[]> 是否分配在连续内存中?

c# - 从 EPiServer 的 PageFiles 文件夹中获取目录

c# - 获取静态对象上的锁会阻塞其他请求线程吗?

c# - PartialView 在 ajax 重新加载时无法正确呈现

c# - 如何在按钮单击事件上打开新的浏览器窗口?

c# - 更改生成的单元测试文件的目录

asp.net-mvc - 确定 AuthorizeAttribute 是在类级别还是方法级别

c# - DDD、EF、聚合

c# - self 跟踪实体的目的是什么?

.net - Visual Studio 2019 .EDMX 从数据库更新模型不起作用