获取Audit表的应用程序用户名

时间:2014-04-03 22:44:25

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

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

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

4 个答案:

答案 0 :(得分:0)

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

用于胖客户端应用程序,

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表。

答案 1 :(得分:0)

SQL Server知道你是谁。您只需使用SUSER_SNAME()或/和ORIGINAL_LOGIN()函数作为审计表中用户名列的默认值即可。审核事件的时间相同,请使用GetDate()函数。无需从客户端发送此信息。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

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

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

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

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

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

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