避免在会话中为不同的sql架构存储连接字符串

时间:2013-05-28 10:19:46

标签: azure azure-sql-database azure-web-roles

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

我打算使用子域来识别租户。想法是从子域获取租户名称,从登录页面获取用户ID和密码并验证uid,pwd&身份验证的租户ID。如果经过身份验证,则需要将来自应用程序的所有SPROCS调用定向到模式(与租户同名)。

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

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

1 个答案:

答案 0 :(得分:1)

会话中存储连接字符串没有安全隐患,因为会话值未存储在Cookie中。只有会话ID将存储在cookie中,并且会话的每个值与会话ID一起存储在服务器中。

但是在您的案例租户中,连接字符串对于访问应用程序的用户组是通用的。因此在会话中存储将使用更多内存。始终尝试使用Context Approach,例如,您的数据层代码将引用连接字符串,如下所示

String con = AppContext.Current.ConnectionString;

上面的AppContext类将具有基于主机类型检索连接字符串的实际逻辑,例如辅助角色,Web角色,单元测试等。

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

•如果您有存储所有租户信息的中央数据库

,您可以将它们存储在数据库中

•如果您没有此类数据库,则可以创建Azure表来存储租户信息

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