SQL Server和asp.net应用程序安全模型/最佳实践

时间:2009-01-14 15:58:15

标签: asp.net sql-server security

对于针对sql server的asp.net Web应用程序(至少需要登录才能访问)我通常按如下方式实现安全性:

我通常会滚动自己的用户注册,用户登录页面并在sql server中保留用户ID和加密密码,并根据该表验证登录信息 - 我还提供忘记密码,“发给我密码”,电子邮件验证通过自定义代码激活帐户等。

一旦用户通过应用程序验证(并假设所有用户都具有相同的权限),我通常使用实用程序logonid让asp.net与sql server通信,所以换句话说我只需要创建每个应用程序只有一个登录ID,并且由于100%的所有数据访问都是通过存储过程完成的,因此我只需要授予对单个用户的访问权限以执行存储过程,并且在sql server上不需要其他工作。每个应用程序都有自己的数据库,该应用程序的登录只能访问该数据库。

所有这些对我来说都非常有效,唯一不利的是能够在sql server中设置跟踪并查看正在调用的用户标识和过程,但由于所有用户都是'通过单一数据库登录与数据库进行交谈,这是不可能发生的。

所以,有两部分问题:

1)您是否有人应该考虑使用安全模型?很容易一遍又一遍地做同样的事情 - 特别是因为它有效 - 但是还有其他模型可以更好地工作或我应该考虑吗?是否建议从asp.net应用程序访问所有数据库都共享一个数据库登录?或者这被认为是不好的做法?如果是这样,为什么?

2)假设我坚持使用我的模型,是否有办法允许在sql跟踪窗口中看到应用程序登录ID?很高兴看到sp被调用以及登录系统的人的用户ID(而不是数据库登录)。

6 个答案:

答案 0 :(得分:4)

  

是否建议练习全部   从asp.net应用程序访问数据库   将共享一个数据库   登录资讯?

是的,主要用于连接池。

关于2),我通常通过登录ASP.NET端来做到这一点。

答案 1 :(得分:1)

1)建议您的Web应用程序通常只使用一次登录数据库。如果你不这样做,你将被迫模仿你的来电者,这是典型的不推荐,并且它不能很好地扩展。您不应为每个用户使用不同的连接字符串。例如,为每个用户使用SQL身份验证是一个坏主意。它会使连接轮询无效。

2)您可以通过修改连接字符串来实现此目的,但这会使连接pollign无效。

答案 2 :(得分:1)

从.NET最佳实践的角度来看,您可能需要考虑查看Microsoft Enterprise Library。它包含一组实践,模式和功能,可帮助解决安全性和数据访问等问题。

答案 3 :(得分:0)

1)只要您使用存储过程进行访问,一次登录就可以了。有些人喜欢使用一个用于管理员。

2)您可以修改存储过程以接受用户ID作为参数。

答案 4 :(得分:0)

我通常会共享一个用户进行连接池。

在您可能需要跟踪特定用户的情况下。我在管理功能中编写,您可以使应用程序使用第二个数据库登录。然后,您可以为特定用户启用此功能并单独跟踪该用户。

它只是意味着您可以一次性跟踪,但保留应用程序其余部分的单个用户连接池。

答案 5 :(得分:0)

我也一直在使用相同的方法。最近,我想知道这是否会影响应用程序的可扩展性。我的数据库服务器具有多核处理器,并且能够进行并行操作,但我认为SQL Server序列化查询使用相同的用户ID运行。我认为这意味着来自不同实际用户的存储过程正在排队,因为SQL Server将它们视为来自相同的用户ID。

如果是这种情况,我认为这会严重限制我应用的可扩展性,不是吗?