Asp.net 什么';这是在多租户体系结构中通过应用程序传递租户id的最佳方式
我们公司有一个多租户asp.net web应用程序。该应用程序为3层,例如网站、业务和数据访问。用户登录后,我们在会话中保留租户id 当我们需要获取“客户或订单”列表时,我们会将租户id从网站传递到企业,再传递到数据访问,然后传递到数据库(并查询该租户的客户或订单)。(几乎每个业务函数都将tenantId作为参数) 有时,在创建新功能时,开发人员忘记将租户id从网站添加到数据库,从而导致安全问题 我们有没有办法做到这一点,这样开发人员就不需要总是记住传递租户idAsp.net 什么';这是在多租户体系结构中通过应用程序传递租户id的最佳方式,asp.net,c#-4.0,architecture,Asp.net,C# 4.0,Architecture,我们公司有一个多租户asp.net web应用程序。该应用程序为3层,例如网站、业务和数据访问。用户登录后,我们在会话中保留租户id 当我们需要获取“客户或订单”列表时,我们会将租户id从网站传递到企业,再传递到数据访问,然后传递到数据库(并查询该租户的客户或订单)。(几乎每个业务函数都将tenantId作为参数) 有时,在创建新功能时,开发人员忘记将租户id从网站添加到数据库,从而导致安全问题 我们有没有办法做到这一点,这样开发人员就不需要总是记住传递租户id 关于如何最好地解决此问题的任何建
关于如何最好地解决此问题的任何建议。如果会话中有值,并且在数据库查询中需要该值,则必须通过层将其传播到数据库查询 如果您的开发人员有时忘记传递值,并且他们遇到了安全问题,那么这实际上不是一个安全问题,而是一个安全特性
如果数据库需要该id,那么业务层方法应该具有该id的参数。他们怎么会忘记呢?听起来你好像在逐个传递所有的值 如果您构造了一个可以自由传递的对象,那么您将始终拥有所需的信息。我假设UserId总是与租户关联。您能否构建一个简单的对象,将其存储在会话中,然后将其传递给所有需要它的函数 类用户{ int用户标识; 国际租户协会;
}一种方法是为每个租户创建每个表的视图(根据租户的数量和更改频率可能不太实际),并拒绝对基础表的应用程序访问 本文介绍了如何做到这一点,以及其他几种方法及其性能权衡: 然后在每个业务对象中使用该服务来获取租户id并将其传递到数据层,而无需依赖开发人员来完成。这是一个非常大的安全漏洞,缺少租户可能会返回用户不应该看到的数据,并可能导致公司关闭
public class CommonService
{
public int getTenantId()
{
//do your validations and error handlings
string tid = session["tenantId"] // or get it from customs claims principal or set it in a httpcontext.current.items
return tid;
}
}