【问题标题】:Get application username for Audit table获取审计表的应用程序用户名
【发布时间】:2014-05-16 00:47:03
【问题描述】:

我想实现一个审计表,但我不知道我应该如何获取用户名。

我正在使用 C# 和 Sql Server。我的数据库中有一个用户表。当我登录我的 Windows 窗体应用程序时,我会验证是否使用了正确的用户名和密码组合。但是我如何通知当前用户的数据库呢?我想在我的用户表中添加一个额外的列,在其中将登录的用户名设置为 1。这是单用户的解决方案吗?但是我的应用程序应该支持多用户。在这种情况下可以做什么?

【问题讨论】:

  • 您的用户是 Windows/AD 用户帐户吗?还是应用程序特定的用户(即在数据库的用户表中定义或类似的东西)?您使用什么身份验证方法连接到数据库?您是使用 Windows 身份验证还是有特定的数据库用户/密码组合?
  • 他们是特定于应用程序的用户,我想我想要的是特定的数据库用户/密码组合..

标签: c# sql-server audit multi-user


【解决方案1】:

根据您的身份验证方案,您需要获取用户名。

对于胖客户端应用程序,

Environment.Username

System.Security.Principal.WindowsIdentity.GetCurrent()

有几个选项。

通常对于审计表,有一个名为“ModifiedByUser”的列,您可以在其中记录 win 表单应用程序提供的用户名。

  1. 在您的审计表中创建 nvarchar 和 datetime 列(如果还没有的话)。
  2. 一个存储用户名,另一个存储审计操作的日期时间。
  3. 在您的代码中,每当您想向审计表中添加条目时,获取 Environment.Username 或 System.Security.Principal.WindowsIdentity.GetCurrent() 以及 DateTime.UtcNow 并将其传递给以保存到DB 到 Audit 表中。

【讨论】:

  • 当您说身份验证方案时,您是指 NTLM 还是 Kerberos? (我刚刚发现这些是在 sql-server 上使用的)。您能否提供一个 ModifiedByUser 列如何工作的示例,或者您能否更具体一点? (审计表也是我创建的。)
  • 感谢您的更新。这适用于 Windows 用户帐户。但是对于特定于应用程序的用户(存储在数据库表中),可以做什么?
  • 你能解释更多吗?这里的应用程序特定用户是什么意思?
  • 我的意思是我的数据库有一个表,用户。当我登录到我的 Windows 窗体应用程序时,我会检查用户和密码是否与该表的任何记录匹配。我希望该记录中的字段用户名是插入到审计表中的用户名。
  • 哦,好吧。在这种情况下,Windows 窗体应用程序应始终将登录用户的用户名存储在内存中,并使用它将其保存到数据库中。
【解决方案2】:

SQL Server 知道你是谁。您可以简单地使用SUSER_SNAME() 或/和ORIGINAL_LOGIN() 函数作为审计表中用户名列的默认值。审计事件的时间也一样,使用GetDate()函数。无需从客户端发送此信息。

【讨论】:

    【解决方案3】:

    这是一个非常开放的问题,但我想我理解你想要做什么。您有在用户表中定义的特定于应用程序的用户(而不是使用数据库用户或活动目录用户),并且您需要记录特定信息以进行审计或基于登录驱动安全性。对吗?

    这可以做到,但是需要在你的应用程序中编写它的逻辑。

    假设我们正在编写一个程序来向客户发送发票。 我使用了基于角色的安全性,您可以通过授予用户角色来授予用户执行特定任务的权限。例如,“创建新发票”可以是一个角色。我通常为此准备 2 张桌子:

    1. 安全角色定义
    2. SecurityRoleUsers

    第一个表,安全角色定义将有一个 ID 列,描述(“创建新发票”),我通常有一个审计列来指示是否需要记录此操作审计。

    第二个表 SecurityRoleUsers 是我定义用户是否有权执行该角色的地方。列通常是这样的:唯一 ID、用户 ID(Users 表的外键)、RoleID(SecurityRoleDefintion 的外键)

    现在在您的应用程序中,我们需要一个类来检查用户是否具有角色。它需要接受角色 ID(或名称)和用户 ID。示例:public bool IsUserAuthorized(int RoleID, int UserID)

    此方法可以对您的 SecurityRoleUsers 表运行查询,以查看用户是否在该角色的表中。如果是,则返回 true。如果不是,则返回 false。

    现在返回应用程序,当用户单击“创建新发票”按钮时,它会运行 IsUserAuthorized() 方法来检查用户是否可以执行该操作。

    如果需要创建审核日志,您可以执行类似的操作。完成“创建新发票”的安全检查后,您可以检查角色是否需要被审计记录,如果需要,则写入审计表。

    【讨论】:

    • 我确实有这些表,并且我已经实现了检查用户权限的功能。我的问题是如何将当前用户名传递给我的审计表,用于多用户应用程序。似乎 CONTEXT_INFO 有效(插入了当前用户名),但因为我没有在多个设备上安装该应用程序,我不确定它会如何运行。
    【解决方案4】:
    DECLARE @username varchar(128)
        SET @username = CONVERT(VarChar(128), CONTEXT_INFO());
        PRINT @username
        DECLARE @ID_User int
        SET @ID_User = ( SELECT Users.ID_User
                           FROM Users
                             WHERE Users.Username=@username )
        PRINT @ID_User
    

    我就是这样解决的。我在每个更新触发器中都插入了这段代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 2010-09-26
      • 2019-12-13
      • 2011-05-06
      • 2013-04-10
      • 2015-10-08
      相关资源
      最近更新 更多