3

我计划在 Azure 中拥有一个多租户应用程序,其中通过模式分离实现数据隔离。

我打算使用子域来识别租户。想法是从子域中获取租户名称,从登录页面获取用户 ID 和密码,并验证 uid、pwd 和租户 ID 以进行身份​​验证。如果经过身份验证,则应用程序对 SPROCS 的所有调用都需要定向到架构(与租户同名)。

但是,我不想在 web.config 文件中存储租户明智的连接字符串。我能想到的第一个选项是,将模式名称和密码存储在登录页面可接受的表中,并创建特定于租户的连接字符串(及其 UID 和密码)并将其存储在会话中。在初始化任何存储过程时使用此连接字符串。

但是,我并不热衷于在会话中存储模式的 uid 和密码。有没有其他方法来管理这种情况?

4

1 回答 1

3

在会话中存储连接字符串没有安全危害,因为会话值不存储在 Cookie 中。只有 Session ID 会被存储在 cookie 中,并且每个 session 的值都会与 Session ID 一起存储在服务器中。

但是连接字符串对于访问应用程序的用户组是常见的,在您的情况下是租户。所以存储在会话中会使用更多的内存。始终尝试使用上下文方法,例如您的数据层代码将引用连接字符串,如下所示

字符串 con=AppContext.Current.ConnectionString;

上面的 AppContext 类将具有根据主机类型检索连接字符串的实际逻辑,例如工作者角色、Web 角色、单元测试等。

• 您可以将连接字符串存储在web.config 中,key 可以以子域值作为前缀 示例:Subdomain1_connection =connection string

•如果您有存储所有租户信息的中央数据库,您可以将它们存储在数据库中

•如果你没有这样的DB,你可以创建Azure表来存储租户信息

我在任何多租户应用程序中总是有两个上下文变量,AppContext 和 UserContext,这两个上下文提供了适当的数据。所以我的单元测试不关心会话,上下文将根据我的应用程序运行的位置从静态字典或会话或数据库或 Azure 表中传递值。

于 2013-08-13T13:05:22.227 回答