2012-12-02 66 views
0

我正在開發一個API作爲Windows應用程序和數據庫之間的中間人。網絡服務器將只是一個ASP。 NET通用處理程序返回json。 用戶將登錄到應用程序,他們的憑據將通過電線傳輸。從那裏我要做的是生成一個會話密鑰,應用程序可以使用從那時起的每個請求。 在可預見的未來,這不會是一個開放的API。 現在我想知道的是,如果這足夠安全?我怎樣才能阻止人們使用提琴手來複制電話? 有沒有更好的方法呢?如果我使用SSL,會有幫助嗎?如何保護API

我不想通過使用oauth來使事情複雜化。

謝謝!

回答

1

使用SSL。爲了獲得會話令牌,客戶端應該使用通過SSL傳輸的用戶名和密碼進行身份驗證。一旦通過驗證,令牌應通過SSL傳輸到服務器以防止中間人攻擊。

因此,這裏的流量:

  1. 客戶端通過SSL送他的憑據(用戶名和密碼)發送到Web方法
  2. Web方法驗證憑據,並生成會話令牌,並返回該會話令牌給客戶。
  3. 客戶端發送會話令牌在對受保護資源的後續請求中。
  4. 服務器驗證令牌以及是否有效授予訪問受保護資源的權限。

您使用簡單的Forms Authentication來生成會話令牌。 FormsAuthentication.EncryptFormsAuthentication.Decrypt方法對你來說可能是一個好的開始。表單身份驗證令牌包含當前已通過身份驗證的用戶的加密值。如果您正在Web場中運行,請確保您的Web場的所有節點上都有靜態的machine keys,否則在一個節點上加密的會話令牌可能不會在另一個節點上解密。

作爲會話令牌的替代方案,您可以通過SSL使用basic authentication。缺點是證書通過每個請求的線路發送。即使您使用SSL,密碼仍然通過電話傳輸,因此此方法不如會話令牌安全,但更易於設置。

+0

感謝您的詳細解答! 但是,一個問題是我無法控制數據庫。我將連接到現有的MySQL數據庫,並且不能更改模式。現在據我所知(我已經離開了ASP開發了很久),爲了實現ASP.NET窗體auth,您需要使用他們的模式或編寫自定義實現。後者會再次過度複雜化。 是否有任何問題只是讓我自己創建會話密鑰的方式?像散列用戶名和其他變量? – Matt

+0

@Matt,Forms Authentication與任何數據庫或模式都完全無關。您似乎將表單身份驗證與成員資格提供程序混淆,這是兩種完全不同的概念。你可以完全正確地使用FA與會員資格和會員資格沒有FA。所以在你的情況下,你需要做的就是檢查數據庫的用戶名和密碼(不管這個數據庫是什麼),然後調用Encrypt方法來生成密鑰並作爲cookie或自定義頭返回給用戶。散列用戶名將無濟於事,因爲... –

+0

...散列是一個不可逆過程。這意味着如果你給這個用戶這個散列,然後他發送給你另一個請求,你就無法知道誰是用戶,除非你在數據庫中存儲了這些散列。另一方面FA是無國籍的。它使用加密(而不是哈希)。 –