【发布时间】:2012-07-15 05:49:38
【问题描述】:
我希望能提供一些关于基于 MVC 的多租户站点中的数据访问/控制的建议:
是否有更好/更安全/优雅的方法来确保在多租户站点中用户只能处理自己的数据。 有多个租户使用相同的应用程序:firstTenant.myapp.com, secondTenant.myapp.com...
//
// GET: /Customer/
// show this tenant's customer info only
public ViewResult Index()
{
//get TenantID from on server cache
int TenantID = Convert.ToInt16( new AppSettings()["TenantID"]);
return View(context.Customers.ToList().Where(c => c.TenantID == TenantID));
}
如果用户第一次登录并且没有此租户/用户的服务器端缓存 - AppSettings 会检查 db 并将 TenantID 存储在缓存中。
数据库中的每个表都包含 TenantID 字段,用于将数据的访问权限限制为只有适当的租户。
那么,言归正传,如果数据属于当前租户,我可以做一些更“高效”的事情,而不是检查每个控制器中的每个操作吗?
例子:
当 firstTenant 管理员尝试为用户 4 编辑一些信息时,url 有: http://firstTenant.myapp.com/User/Edit/4
假设 ID 为 2 的用户属于 secondTenant。 firstTenant 的管理员 put http://firstTenant.myapp.com/User/Edit/2 在 url 中,并尝试获取不属于他的公司的信息。
为了防止在控制器中发生这种情况,我检查正在编辑的信息是否实际上由当前租户拥有。
//
// GET: /User/Edit/
public ActionResult Edit(int id)
{
//set tennant ID
int TenanatID = Convert.ToInt32(new AppSettings()["TenantID"]);
//check if asked info is actually owned by this tennant
User user = context.Userss.Where(u => u.TenantID == TenantID).SingleOrDefault(u => u.UserID == id);
//in case this tenant doesn't have this user ID, ie.e returned User == null
//something is wrong, so handle bad request
//
return View(user);
}
基本上这种集合需要放置在每个可以访问任何数据的控制器中。是否有(以及如何)更好的方法来处理这个问题? (过滤器、属性...)
【问题讨论】:
标签: c# asp.net-mvc multi-tenant