【发布时间】:2014-11-28 01:41:42
【问题描述】:
我正在尝试构建一个多租户 mvc 5 站点,该站点使用单个数据库并在 Sql Server 中按模式区分租户。 我从默认的 Mvc 5 模板开始,并更新了提供的 ApplicationDBContext 以获取指定用于该租户的架构的字符串,就像这样。
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
private string _tenantSchema;
public ApplicationDbContext(string tenantSchema)
: base("Dev", throwIfV1Schema: false)
{
_tenantSchema = tenantSchema;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(_tenantSchema);
base.OnModelCreating(modelBuilder);
}
public static ApplicationDbContext Create(string tenantSchema)
{
return new ApplicationDbContext(tenantSchema);
}
}
然后在 App_Start\IdentityConfig.cs 中,我更新了 ApplicationUserClass 的 Create 方法,以使用 Request.Host 值的第一部分作为租户架构,就像这样
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var tenantSchema = context.Request.Host.Value.Split('.')[0];
var ctx = new ApplicationDbContext(tenantSchema);
var userStore = new UserStore<ApplicationUser>(ctx);
var manager = new ApplicationUserManager(userStore);
因此,如果我要登录到 site1.mysite.dev,它将针对 site1 架构中的表进行身份验证,即 sql server。
当我启动站点并使用 site1 子域访问它时,它正确地使用 site1 Schema 对我进行身份验证。但是,如果我在浏览器地址栏中更改 url 并再次登录,它仍然会针对 site1 架构进行验证。
如何配置应用程序以用于更正架构以检查每个请求的身份验证?
【问题讨论】:
-
您是否已调试并验证是否在每个请求上都调用了 Create?如果是这样,tenantSchema 是否真的有你期望的数据?如果每个请求都没有调用它,那么您配置错误,请显示您的 Startup.Auth
标签: asp.net-mvc entity-framework authentication asp.net-identity multi-tenant