【问题标题】:How can I log user name when SQL Server database on different server than web server?当 SQL Server 数据库与 Web 服务器位于不同的服务器上时,如何记录用户名?
【发布时间】:2015-10-03 17:45:26
【问题描述】:

我创建了用于编辑数据的 ASP.NET Web 表单,并且基础数据库表具有与用户名、日期和使用触发器填充的更改数据相关联的审计表。 SQL Server 数据库与 Web 服务器位于不同的服务器上。要求是将各个用户名记录在审计表中。我发现这样做的唯一方法是: • SQL 连接字符串指定集成安全性,并且 • IIS 身份验证指定 ASP.NET 模拟和基本身份验证。 为了使用该应用程序,用户输入他们的 Windows 凭据以登录到 Web 服务器并访问底层 SQL Server 数据库,并且必须是具有读/写/执行存储过程权限的组的一部分。 这是在不使用表单身份验证和关联的“用户”表的情况下完成此操作的唯一方法吗?对于内部网站,这是否被认为足够安全?

【问题讨论】:

  • 如何创建一个拥有这些权限的 SQL 用户,然后通过将 Integrated Security 更改为 false,将该用户的凭据放在连接字符串上?这样,您甚至不需要在网站上进行任何身份验证。

标签: asp.net sql-server security authentication


【解决方案1】:

如果您想使用表单身份验证,则需要使用Impersonation

示例表:

create table foo (
  id int primary key,
  bar varchar(255) not null,
  inserted_by_user varchar(255) default current_user
);

这需要您的数据库连接池提供一些帮助。

当您从池中获得连接时,运行以下命令:

execute as user = 'alice'; -- where alice is the logged in user's username

然后运行您计划运行的常规 SQL 查询:

insert into foo (id, bar) values (1, 'whatever');

当您将连接释放回池时,请运行以下命令:

revert;

当您查看表 foo 时,您应该会看到:

id  bar       inserted_by_user
------------------------------
1   whatever  alice

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多