2014-04-03 38 views
0

我想实现审计表,但我不知道如何获取用户名。获取审计表的应用程序用户名

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

+0

您的用户是Windows/AD用户帐户吗?或者是特定于应用程序的用户(即在数据库中的用户表中定义的或者这些行中的某个用户)? 您使用什么验证方法连接到数据库?您是使用Windows身份验证还是您有特定的数据库用户/密码组合? –

+0

他们是应用程序特定的用户,我想我想要的是一个特定的数据库用户/密码组合.. –

回答

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 [email protected]) 
    PRINT @ID_User 

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

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到审计表中。
+0

当你说认证方案你的意思是NTLM或Kerberos? (我刚刚发现这些在sql-server上使用)。您能否提供一个关于ModifiedByUser列如何工作的例子,或者您能否更具体一些? (审计表也是由我创建的。) –

+0

更新了答案 –

+0

感谢您的更新。这适用于Windows用户帐户。但对于特定于应用程序的用户(存储在数据库表中),可以做些什么? –

0

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

0

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

这可以完成,但它的逻辑将需要写入您的应用程序。

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

  1. SecuirtyRoleDefintion
  2. SecurityRoleUsers

拳头表,安全角色定义将有一个ID列,则说明(“创建新发票”),而且我通常有一个审计列来指示是否需要为审计记录此操作。

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

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

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

现在回到应用程序中,当用户点击“Create New Invoice”按钮时,它会运行IsUserAuthorized()方法来检查用户是否可以执行该操作。

如果创建审计日志是必要的,你可以做类似的事情。在为“创建新发票”完成安全检查后,您可以检查角色是否需要审核记录,如果是,则写入审核表。

+0

我确实有这些表,并且我已经实现了检查用户权限的功能。我的问题是如何将当前用户名传递给我的审计表,对于多用户应用程序。它看起来CONTEXT_INFO工程(当前用户名被插入),但因为我没有安装在多个设备上的应用程序,我不知道它将如何表现。 –

相关问题