如果这与其他内容重复,请提前道歉 - 我看过许多帖子围绕类似的问题但没有解决我的具体情况。
我们正在做的是使用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
我猜测的是我需要:
我计划一旦用户提名他们想要使用哪个租户,该信息将作为声明存储在cookie中,并在每个请求中读出以定位正确的数据库。
答案 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标识表结构的限制。