2009-01-14 66 views
2

對於針對SQL Server我的asp.net web應用程序(至少需要登錄訪問的那些)我一般實行安全如下:SQL Server和asp.net應用程序的安全模式/最佳實踐

我一般滾動我自己的用戶註冊,用戶登錄頁面,並保留一個用戶ID和一個加密的密碼在SQL服務器和驗證登錄對該表 - 我還提供了忘記密碼,'給我我的密碼',電子郵件驗證激活帳戶等所有通過自定義代碼。

一旦用戶通過了應用程序驗證(並假設所有用戶都具有相同的權限),我通常會使用實用程序logonid讓asp.net與sql server進行通信,換句話說,我只需要爲每個應用程序創建一個登錄ID,並且由於所有數據訪問的100%都是通過存儲過程完成的,因此我只需將訪問權限授予單個用戶即可執行存儲過程,並且在SQL Server上不需要其他工作。每個應用程序都有自己的數據庫,並且該應用程序的登錄只能訪問該數據庫。

所有這些對我來說都非常好,唯一的負面影響就是能夠在sql server中設置跟蹤並查看正在調用的userid和proc,但由於所有用戶都是通過單個數據庫登錄「通話」到數據庫,這不會發生。

所以,問題的兩個部分:

1)是否有安全模型是您使用我應該考慮的鄉親?它很容易總是做同樣的事情 - 特別是因爲它的工作原理 - 但有沒有其他模式可以更好地工作或我應該考慮?建議的做法是,所有來自asp.net應用程序的數據庫訪問都將共享一個數據庫登錄名?或者這被認爲是不好的做法?如果是這樣,爲什麼?

2)假設我堅持使用我的模型,是否有辦法允許在sql trace窗口中看到應用程序登錄ID?很高興看到sp被調用,並且登錄到系統的用戶的用戶標識(而不是數據庫登錄)。

回答

4

下建議的做法,從一個asp.net應用 所有 數據庫訪問都會共享一個數據庫 登錄?

是的,主要用於連接池。

關於2),我通常通過在ASP.NET端登錄來做到這一點。

0

1)只要您使用存儲過程進行訪問,一次登錄可能沒有問題。一些人也喜歡使用一個管理員。

2)您可以修改您的存儲過程以接受用戶ID作爲參數。

+0

>> ou可以修改您的存儲過程以接受用戶ID作爲參數。 我認爲這是爲未來的項目,但不是已經存在的代碼庫。 – 2009-01-14 16:07:10

1

1)建議您的Web應用程序通常使用單一登錄數據庫。如果你不這樣做,你將被迫冒充你的呼叫者,這是典型的不推薦的,並且它不能很好地擴展。您不應該爲每個用戶使用不同的連接字符串。例如,爲每個用戶使用SQL身份驗證是一個壞主意。這將使連接輪詢無效。

2)您可以通過修改連接字符串來做到這一點,但這會使連接投票無效。

1

從a。NET最佳做法的角度來看,你可能要考慮看​​看Microsoft Enterprise Library。它包含一組實踐,模式和功能,可幫助解決諸如安全和數據訪問等問題。

0

我通常會共享一個用戶連接池。

在您可能需要跟蹤特定用戶的情況下。我使用管理功能編寫了應用程序使用第二個數據庫登錄的功能。然後,您可以爲特定用戶啓用此功能並單獨跟蹤該用戶。

這隻意味着您可以追蹤一次,但爲應用程序的其餘部分保留單用戶連接池。

0

我也一直在使用相同的方法。最近,我想知道這是否會影響應用程序的可擴展性。我的數據庫服務器有多核處理器,並且具有很好的並行操作能力,但我認爲SQL Server序列化的查詢使用相同的用戶ID運行。我認爲這意味着來自不同實際用戶的存儲過程正在排隊,因爲SQL Server將它們全部視爲來自相同的用戶ID。

如果是這樣的話,我認爲這會嚴重限制我的應用的可擴展性,不是嗎?