【问题标题】:Asp.net SQL Server user impersonationAsp.net SQL Server 用户模拟
【发布时间】:2012-10-12 17:22:53
【问题描述】:

我想知道是否有人可以指出我正确的方向。我们目前正在寻求更新一个使用 SQL Server 2005 作为其数据库的 ASP.NET 应用程序。我们需要提供强大且一致的功能,以防止某些用户从数据库中创建、更新、删除某些记录。

不幸的是,该应用程序不是使用 OO 概念编写的,而是支持直接从文件后面的网页代码调用的许多数据访问存储过程。由于存储过程的数量庞大,我们更愿意研究数据库触发器来实现我们的安全性。

问题是; db 触发器是否有可能知道执行 sp 的特定应用程序用户(使用 db 中的自定义用户帐户表进行管理)?我们只需要一个id。用于连接到数据库的连接字符串对于所有用户都是相同的(取自 web.config),有没有办法连接到一些如何模拟用户或设置触发器可访问的特定变量?

【问题讨论】:

    标签: asp.net sql-server sql-server-2005


    【解决方案1】:

    如果应用程序使用 SqlConnection 来“登录”用户,然后使用相同的 SqlConnection 执行数据访问/更新,那么您可以使用CONTEXT_INFO()。在“登录”过程中设置上下文,然后在数据访问/更新过程中检查它。见Using Session Context Information

    但如果应用程序使用 SqlConnection 来“登录”,缓存结果(可能在 cookie 中或在 ASP 会话状态中),然后使用不同的 SqlConnection 访问数据,则无法访问所需的登录信息没有应用程序支持。如果您可以找到创建 SqlConnection 对象的所有位置并将其重构为使用the factory pattern,那么您可以通过调用set the context info 来增加每个打开的连接,然后再将其返回给调用者以供使用,这也可以工作,只需最少应用程序的变化。

    【讨论】:

    • 进一步查询:这如何与连接池一起工作?例如,是否存在其他人可能会挑选出已经设置了上下文的连接的风险?
    • 连接池将重置 context_info
    猜你喜欢
    • 2011-08-29
    • 2010-09-27
    • 1970-01-01
    • 2017-12-10
    • 2015-01-23
    • 1970-01-01
    • 2015-06-02
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多