我在用户PC上安装了一个富客户端程序,我想在SQL Azure / SQL Server上开始存储一些用户创建的数据。潜在的匿名用户将键入他们的名称,电子邮件帐户和密码,这些密码将存储在SQL Azure / SQL Server上。然后他们将开始生成自己的数据。我预计可能有1000名用户。
有些时候,这些用户希望针对自己的数据运行自己的查询,但显然,我必须确保他们永远不会查看其他用户的数据。
我认为确保数据安全的最佳方法是为每个用户发布自己的SQL Azure帐户和密码。我将设置一个SQL Azure用户和长密码,只有我才知道,它只有执行多个存储过程的权限,并将适当的参数传递给那些将创建SQL Server帐户,登录并将用户添加到角色的SP。我创造了。
显然有人运行调试工具可以找出用户名和密码,但我认为这不是什么大问题。如果所有特定的SQL Azure帐户都可以执行一些SP,那么如果恶意个人开始这样做了。在我要求付款之前,我只允许上传非常有限的数据。
用户只能使用使用以下内容的存储过程插入记录:
SELECT @uName=SYSTEM_USER
并且只选择适当的父记录。用户可以执行的所有存储过程都具有上述要求,以确保它们只能使用自己的记录。
所有视图都会嵌入WHERE子句,例如
WHERE tbLoginName = SYSTEM_USER.
我是SQL Server的新手,因此我可能会遗漏一些基本概念,所以我会感谢所有评论。
答案 0 :(得分:0)
我想指出您提到的方法中的潜在问题:您的主SQL Azure帐户需要具有创建新帐户的权限并授予他们对特定表的访问权限。这意味着您的主帐户本身也需要访问所有这些表。如果您在客户端存储主帐户,聪明的用户将可以访问所有用户数据。
根据我的经验,直接从客户端应用程序连接到数据库几乎总是会使您的解决方案不那么安全。您可以将其用于测试目的,但在现实世界的解决方案中,我建议您使用服务。您可以在Windows Azure中托管该服务。然后服务将访问数据库,客户端应用程序只能访问该服务。通过这种方式,您可以使用任何您喜欢的机制对客户端进行身份验证,例如ASP.NET成员资格。
最诚挚的问候,
徐明。答案 1 :(得分:0)
您实际上是在创建物理双层数据库连接,允许客户端应用程序直接连接到数据库。这在许多方面都是一个问题,包括安全性和性能。从安全角度来看,无法控制客户的连接位置,您需要保持防火墙规则的开放性,以便世界上的任何人尝试破解每个客户的uid / pwd。而不是只有1个用户ID,黑客将有多达1,000 ...
第二个问题是表现。您的应用程序将无法利用连接池,在数据库服务器上造成过度压力,并可能在某些时候遇到限制问题。使用Web服务,使用ASP.NET成员资格来管理登录,并使用服务帐户(即相同的uid / pwd)来获取数据将确保如果您为所有请求保持连接字符串相同,则将正确利用连接池。
通过Web服务层,您还可以轻松获得一大堆新选项,这是双层架构所无法提供的。这包括集中您的业务和数据访问逻辑,添加缓存以提高性能,在集中位置添加审计,允许更新部分应用程序,而无需在客户位置重新部署任何内容等等......
在云计算中,您可以更好地利用网络服务。
我的2美分。
答案 2 :(得分:0)
问题是,正如http://msdn.microsoft.com/en-us/library/ms189751.aspx所指出的那样:
在SQL Azure中,只有服务器级主体登录(由配置过程创建)或master数据库中loginmanager数据库角色的成员才能创建新登录。
这些帐户还可以更改和删除登录。因此,如果您在客户端应用程序中嵌入这些帐户,则基本上授予每个用户更改/删除其他用户帐户的权限。虽然普通用户不会这样做,但黑客会这样做。因此,您不能让客户端应用程序管理SQL Azure登录,除非只允许受信任的用户(例如您的IT管理员)使用该应用程序。
最诚挚的问候,
徐明。