我想实现一个审计表,我不知道我应该如何获得用户名。
我正在使用C#和Sql Server。我的数据库中有一个Users表。当我登录我的Windows窗体应用程序时,我验证是否使用了正确的用户名和密码组合。但是如何通知数据库当前用户?我想在我的Users表中添加一个额外的列,在其中设置1记录的用户名。这是单用户的解决方案吗?但我的应用程序应该支持多用户。在这种情况下可以做些什么?
答案 0 :(得分:0)
根据您的身份验证方案,您需要获取用户名。
用于胖客户端应用程序,
Environment.Username
和
System.Security.Principal.WindowsIdentity.GetCurrent()
有两种选择。
通常对于审计表,有一个名为“ModifiedByUser”的列,您可以在其中记录win表单应用程序提供的用户名。
答案 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表中定义的应用程序特定用户(而不是使用数据库用户或活动目录用户),您需要记录特定信息以进行审计或根据登录驱动安全性。这是对的吗?
可以这样做,但需要在你的应用程序中编写它的逻辑。
让我们假装我们正在编写一个程序来向客户发送发票。 我使用基于角色的安全性,您可以通过授予用户角色来授予用户执行特定任务的权限。例如,“创建新发票”可能是一个角色。我通常有两张桌子:
第一个表安全角色定义将有一个ID列,描述(“创建新发票”),我通常有一个Audit列来指示是否需要记录此操作审计。
第二个表 SecurityRoleUsers 是我定义用户是否有权执行该角色的地方。列通常是这样的:唯一ID,用户ID( Users 表的外键),RoleID( SecurityRoleDefintion 的外键)
现在,在您的应用程序中,我们需要一个类来检查用户是否有角色。它需要接受角色ID(或名称)和用户ID。示例:public bool IsUserAuthorized(int RoleID, int UserID)
此方法可以在 SecurityRoleUsers 表上运行查询,以查看用户是否在该角色的表中。如果是,则返回true。如果不是,则返回false。
现在,当用户点击“创建新发票”按钮时,它会返回应用程序,它会运行 IsUserAuthorized()方法来检查用户是否可以执行操作。
如果需要创建审核日志,您可以执行类似的操作。在对“创建新发票”进行安全检查后,您可以检查是否需要审核角色,如果是,则写入Audit表。