2014-04-03 56 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工程(當前用戶名被插入),但因爲我沒有安裝在多個設備上的應用程序,我不知道它將如何表現。 –

相關問題