【发布时间】:2015-06-10 01:34:46
【问题描述】:
我正在开发一个租户应用程序,我想知道如何阻止租户访问其他租户数据。
首先,让我揭露一些事实:
- 该应用不是免费的,100% 可以肯定恶意用户是客户端。
- 所有主键/标识都是整数(Guid 解决了这个问题,但我们现在无法更改)。
- 该应用使用共享数据库和共享架构。
- 所有租户均为商业集团,拥有数间店铺。
- 我正在使用 Forgery...
我有一些 下拉列表 选择的远程数据,它可以轻松更改其他租户的 id 和访问数据,如果您有一点了解,您可以了解其他租户数据。
我认为第一件事是检查每个远程字段,但这有点烦人......
因此,我使用 Model Convention 和 Composite Keys 构建了一个与 Code First Migrations 兼容的解决方案,很少经过测试,可以按预期工作。 p>
解决办法如下:
约定类
public class TenantSharedDatabaseSharedSchemaConvention<T> : Convention where T : class
{
public Expression<Func<T, object>> PrimaryKey { get; private set; }
public Expression<Func<T, object>> TenantKey { get; private set; }
public TenantSharedDatabaseSharedSchemaConvention(Expression<Func<T, object>> primaryKey, Expression<Func<T, object>> tenantKey)
{
this.PrimaryKey = primaryKey;
this.TenantKey = tenantKey;
base.Types<T>().Configure(m =>
{
var indexName = string.Format("IX_{0}_{1}", "Id", "CompanyId");
m.Property(this.PrimaryKey).IsKey().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).HasColumnOrder(0).HasColumnAnnotation("Index", new IndexAnnotation(new[] {
new IndexAttribute(indexName, 0) { IsUnique = true }
}));
m.Property(this.TenantKey).IsKey().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).HasColumnOrder(1).HasColumnAnnotation("Index", new IndexAnnotation(new[] {
new IndexAttribute(indexName, 1) { IsUnique = true }
}));
});
}
}
大会注册:
** 在约定注册时,我传递了两个属性,第一个是主键,第二个是租户 ID。
modelBuilder.Conventions.Add(new TenantSharedDatabaseSharedSchemaConvention<BaseEntity>(m => m.Id, m => m.CompanyId));
基础实体模型
public class BaseEntity
{
public int Id { get; set; }
public int CompanyId { get; set; }
public Company Company { get; set; }
}
订单实体(示例)
** 在这里,我参考了公司的货币和客户,所有工作都按预期进行......
public class Order : BaseEntity
{
[Required]
public int CurrencyId { get; set; }
[ForeignKey("CompanyId, CurrencyId")]
public virtual Currency Currency { get; set; }
[Required]
public int ClientId { get; set; }
[ForeignKey("CompanyId, ClientId")]
public virtual Client Client { get; set; }
public string Description { get; set; }
}
- 对性能有影响吗?
- 与检查每个远程字段相比有什么缺点吗?
- 有人有相同的想法和/或问题并提出了另一种解决方案?
【问题讨论】:
-
为什么我的帖子被否决
标签: asp.net-mvc entity-framework ef-code-first entity-framework-migrations multi-tenant