2014-12-31 94 views
1

我正在構建我的應用程序,並且我正在對我的類文件頂部的許多設置進行硬編碼 - 例如ApiSidApiKey,SmtpServiceUsername,MyEmailPassword等等。我正在嘗試鞏固這些,我看到兩個選項:MVC5 Web應用程序中的應用程序設置 - 使用C#類與Web.Config?

1)將它們全部推入web.config。我不喜歡這樣的想法,即使用幾十個(幾乎100個)設置來混淆我的web.config,但是...我也對這裏的安全感到不安。
2)構建一個靜態類,它只包含這些設置(Settings.cs) - 基本上包含了整個應用程序引用的一堆常量。

我對第二種方法感覺更舒服,因爲我可以保持我的設置完全隔離,而不用擔心通過web.config暴露它們 - 這種方法有什麼內在錯誤嗎?

+0

作爲大衛下面提到,如果有人可以到達你的web.config文件,很容易他可以訪問你的dll,並藉助反編譯器,你的代碼是完全可讀的,我會建議使用web.config來存儲密鑰但加密 – Monah

回答

1

這種方法有什麼內在的錯誤嗎?

  1. 什麼讓你覺得把常量的代碼是任何更安全比配置?編譯的DLL就在Web.Config旁邊,如果有人可以檢查其中一個,他們可以檢查另一個。硬編碼值可以很容易地反編譯。

  2. 存在配置文件是有原因的。具體而言,如果任何值將在每個環境更改,那麼它屬於配置文件。這種方式可以在任何環境(開發,測試,生產等)中使用相同的代碼庫,您只需編輯該環境的配置值即可。爲了將相同版本部署到新環境而重新編譯代碼並不理想,因爲它不再是同一版本。

    我不喜歡得過且過了我幾十(幾乎100)的web.config的思想設置雖然

爲什麼不呢?如果它們都是平坦的靜態值,則可以使用appSettings鍵列表。如果他們有更多的結構,創建custom config sections

1

這不一定是最好的方法,但我會將這些設置存儲在數據庫中。這爲您提供了數據庫安全設置,並且可以輕鬆更新設置,而無需停止/重新啓動應用程序,以避免踢出用戶。

一旦您在數據庫中進行設置,您可以定期加載它們(比如每隔15-20分鐘)來檢測更改。同時,創建一個數據字典並將其包裝在一個通過屬性提供類型安全訪問的類中,或者直接使用該字典。由於這是Web應用程序,因此您必須使用線程安全類(如ConcurrentDictionary)來確保多個線程可以安全地訪問您的設置。

如果你有這麼多的設置,web.config會很混亂,每一個改變都會強制重啓應用程序池。正如@David在他的回答中提到的那樣,配置文件爲您提供了一種簡單的方法,可以爲不同的環境提供不同的設置,但這對於數據庫方法來說也很容易,其中每個環境可能存在一次設置。

+0

Downvoter:謹慎評論你的downvote? – xxbbcc