获取审核表的应用程序用户名



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

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

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

对于胖客户端应用程序,

Environment.Username

System.Security.Principal.WindowsIdentity.GetCurrent()

是几个选项。

通常,对于审核表,有一个名为"ModifiedByUser"的列,您可以在其中记录 WIN Form 应用程序提供的用户名。

  1. 在审核表中创建 NVarchar 和日期时间列(如果尚未创建)。
  2. 一个将存储
  3. 用户名,另一个将存储审核操作的日期时间。
  4. 在代码中,每当要向审核表添加条目时,请获取 Environment.Username 或 System.Security.Principal.WindowsIdentity.GetCurrent() 以及 DateTime.UtcNow 并将其传递到数据库中的审核表中。

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

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

这是可以完成的,但需要将其逻辑编写在应用程序中。

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

  1. SecuirtyRoleDefintion
  2. 安全角色用户

第一个表,安全角色定义将有一个 ID 列,说明("创建新发票"),我通常有一个审核列来指示是否需要为审核记录此操作。

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

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

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

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

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

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

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

相关内容

最新更新