2010-03-21 70 views
1

基本設置很經典 - 您正在創建一個Windows Forms應用程序,該應用程序連接到一個數據庫並執行各種企業級工作。當然,這樣的應用程序將有許多用戶在數據庫中擁有不同的訪問權限,並且每個用戶都有自己的登錄名和密碼。如何確保Windows窗體應用程序的數據庫安全性?

那麼你如何實現呢?一種方法是爲每個應用程序用戶創建一個數據庫登錄,但這是一件相當嚴重的事情,甚至需要DB服務器上的管理員權限等。如果數據庫服務器託管多個應用程序,管理員很可能不會對此感到高興。

在網絡世界中,通常會創建一個自己的「用戶」表,其中包含所有必需的信息,並使用一個固定的數據庫登錄進行所有交互。這對於一個web應用程序來說都很好,但是windows窗體不能隱藏這個主登錄信息,完全否定安全性。 (它可以嘗試隱藏,但所有這些嘗試很容易被打破)。

那麼...有一些中間的方式嗎?也許可以使用固定登錄登錄,然後從檢查用戶名和密碼的特殊存儲過程中提升權限?

加:好的,所以綜合認證和windows羣體在大多數情況下似乎是公平的選擇,所以我接受了相關的答案。不過,如果任何人都可以想出一個非集成的身份驗證解決方案,他們會從我這裏得到讚揚。

回答

8

對於WinForms使用Windows組。不需要密碼,因爲憑據是使用您的應用程序從Windows登錄推斷的。

這是best practice

基本上:

  • 用戶所屬的組(假設單結構域)
  • 集團是SQL實例
  • SQL登錄映射到數據庫的登錄用戶
  • DB用戶屬於數據庫角色
  • 角色具有對象權限

這是值得擁有的人試圖捕捉這裏的所有信息

編輯之前先讀了起來:

如果你有一個工作組,你仍然可以通過設置sqlbox \鮑勃做到這一點,sqlbox \ hans等在一個sqlbox本地組中。

當有人試圖連接(在他的PC上說bob)時,窗口會詢問他們的詳細信息。只要鮑勃知道他的SQLbox帳戶的詳細資料,他可以連接。

但後來,我還沒有在工作組設置中嘗試這個...

+0

同意。如果您熟悉ASP.NET模型,只需將WinForms應用程序視爲模擬= true並且單個用戶登錄。 – 2010-03-21 12:19:09

+0

好吧,如果您有Windows域,這是個好主意。如果你不......那麼我認爲它不是那麼複雜,但仍然有這樣的應用程序 - 小公司的應用程序等等。而且這些應用程序更可能使用共享數據庫主機。 – 2010-03-21 12:41:43

+0

無論如何Upvoted,但我仍然希望在接受答案之前看到有關非域方案的建議。 – 2010-03-21 12:42:22

1

您不能使用Active Directory組來更容易地管理數據庫連接嗎?

從MSDN ...

名稱可以是Windows用戶名或Windows組名,域\名稱。

這樣你可能會有幾個組,只讀,編輯器,管理器,管理員等。這是我以前用Click-Once應用程序實現過類似的事情。

這真的是你正在做的最好的選擇。

我假設這是一個現有的應用程序?如果是新的,我會另外說要使用Web服務或類似的客戶端服務器。

PK :-)

1

除了使用Windows域/ AD組(放在合適的角色,AD組在SQL Server中創建,因此所有帳戶維護移動到AD),be sure to use the Application Name in your connection string - 這允許您查看哪些應用程序正在執行操作在探查器等

因爲當每個人都從不同的應用程序登錄爲自己 - Windows和Web,它有助於知道它的行動通過應用程序發生,而不僅僅是通過ODBC和Excel進行的任何用戶的臨時查詢,例如(如果您允許用戶訪問某些視圖以進行數據導出或報告wri婷)。

+0

+1。好主意。它並沒有使事情變得更加安全,但它可以提供幫助。 – 2010-03-21 13:51:54

+0

@Vilox - 是的,它不會對安全做出貢獻,但是當每個人都以自己的身份登錄時,您確實喪失了知道他們正在使用哪個應用程序的好處(這是單一應用程序登錄的一個小好處) – 2010-03-21 14:09:21

0

關於想要隱藏身份驗證並使用WinForms使用單個應用程序登錄,如果登錄的權限很小 - 僅選擇視圖並僅在存儲過程中執行,任何設法對您的加密進行逆向工程的人您的應用程序中的登錄信息將只能執行它們在應用程序中可以執行的相同功能。如果您必須提高安全級別,則可以對每個存儲的proc對用戶表進行身份驗證(爲每個SP添加用戶和散列)。另外,定期輪換中央應用程序登錄。

所有這些都比在您的環境中使用集成身份驗證和實施AD平臺困難得多。因此,您正在有效地編寫自己的目錄和身份驗證,而不是使用現成的產品。

除了gbn有關工作組與域的更新之外,您還可以使用RUNAS/NETONLY/USER:SERVER \ USER在您的計算機不屬於的域或服務器上使用用戶憑據運行應用程序。在應用程序建立與數據庫的連接時,遠程憑證將被認證並使用。我有一個應用程序,實際檢查它是如何運行的,如果它沒有運行某個特定的開關,它會提示輸入用戶名和密碼,然後使用Windows API使用與RUNAS/NETONLY/USER等效的功能重新運行它自己:域\用戶。這是因爲我們的工作站目前不在SQL Server的域(或具有信任關係的域)上。在這種情況下,您仍然可以管理SQL Server上本地組或SQL Server域上的組的安全性。你基本上就會失去自動認證令牌。

相關問題