2016-03-01 64 views
2

我正在開發與ASP.Net WebAPI和WPF客戶端/服務器應用程序。 現在我正考慮通過https對基本身份驗證進行身份驗證。您可以提出更好的解決方案,但Windows身份驗證和服務器端會話不適用於我。WPF客戶端WebAPI - 如何處理密碼驗證

對於基本身份驗證,我需要用純文本(base64)在客戶端上的密碼通過電話發送每個請求,對不對?

但我不希望用戶在每次請求時重新輸入密碼,所以我在應用程序啓動時有一個登錄窗口。

WPF PasswordBox使用SecureString並且未綁定到視圖模型。但至少在請求之前,我必須將密碼作爲普通字符串來將其編碼爲base64。 因此無論我做什麼,遲早密碼都以純文本格式存儲在RAM中。

以後的請求保存密碼的最佳做法是什麼?

  • 緩存PasswordBox
  • 緩存SecureString的
  • 高速緩存中的純文本字符串,因爲它會在RAM任一方式
  • 高速緩存中的base64編碼字符串,因爲它至少是不明顯;)
  • ...?

那麼我該如何處理這種合理安全的方式呢? 大型玩家(MS,Google,Apple,...)的其他應用程序不會爲每次通話請求我的密碼,所以必須有一種方法。

+0

爲什麼在地球上你想發送密碼爲Base64?這是一個簡單的,非加密的編碼,所有使用它的用戶都會使用更多的內存。 Base64通常用於將二進制數據編碼爲字符串,而不是字符串作爲更長的字符串。 – ProfK

+0

首先,我要感謝您強調這一點,因爲談論安全主題時應該瞭解這一點。在這種情況下,你對base64絕對沒有幫助。我知道這一點,並且在問這個問題之前我知道這一點。 這就是爲什麼我寫道:_至少它是晦澀難懂的)_ 但爲什麼base64?因爲這是WebAPI的基本身份驗證工作原理:[請參閱asp.net站點](https://www.asp.net/web-api/overview/security/basic-authentication) – alex

回答

0

您應該讀取身份驗證令牌,這是一種常用的方法,而asp.net-web-api框架提供了OWin提供的許多功能。

基本上流程如下:

  • 身份驗證在你的網絡API。
  • 返回一個標記
  • 使用此令牌中的每一個標題下面的網絡API/HTTP請求

好處:

  • 不存儲在內存中的用戶名和密碼(只需一個電話)
  • 令牌可以在服務器端無效
  • 帶有web-api2的開箱即用功能

你可以閱讀一下: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

至於你的WPF客戶端:

您可以創建一個。通過網絡客戶端的HTTP/Web的API請求:

HttpClienthttps://msdn.microsoft.com/en-us/library/system.net.http.httpclient%28v=vs.118%29.aspx

一些僞代碼如下所示:

public async Task<IEnumerable<DataContainer>> GetDataForTarget(string id) 
{ 
    var requestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(new Uri(Host), 
     string.Format("api/Data?id={0}", id))); 

     var response = await Client.SendAsync(requestMessage); 

     //etc... 
} 

注: 對於基於令牌的安全性你需要https,否則令牌可能被攔截。每個知道令牌的人都可以代表相應的用戶撥打web-api。因此,問題基本上從保護密碼轉移到保護令牌。令牌的好處是它的壽命應該比密碼短得多,這就是爲什麼它更安全。儘管如此,將標記存儲在SecureString中仍是有爭議的。

在服務器端

這是

同時是個好習慣(或者即使你不這樣做不道德),其前提是用戶可以選擇自己的密碼,您在使用單向加密機制的服務器來存儲密碼。

這可以通過使用(加密強)隨機salt和使用該非對稱hash加密使用該salt來完成。

要驗證用戶,只需使用存儲的salt加密傳入的密碼,並檢查它是否爲您提供存儲的散列值。在這種情況下,沒有真正的密碼將被存儲在您的服務器上,並且無法檢索用戶密碼(....以及ehh排除一些技術細節)。

+0

謝謝,鏈接到bitoftech.net已經啓發了我一點。到現在爲止,我認爲令牌意味着服務器狀態,並需要多個服務器的共享會話。但根據該網站令牌是自足的。所以我會讀到。 您提到第一個請求在內存中仍然有明文密碼。我應該做些什麼來儘快擺脫它,還是我不得不離開GC的東西? – alex

+0

那麼,例如'securestring'的問題是,當你想使用它時,你需要將它轉換成一個普通的字符串,這是不安全的。因此,在這種情況下,如果您確保託管字符串或文本框在您繼續之前已被清除,那麼您可以做的最好。 – Stefan

+0

另一件事:爲了使基於令牌的安全性起作用,您需要使用「https」,否則可以攔截令牌。每個知道令牌的人都可以代表相應的用戶撥打web-api。因此,問題基本上從保護密碼轉移到保護令牌。令牌的好處是它的壽命應該比密碼短得多,這就是爲什麼它更安全。儘管如此,將標記存儲在「SecureString」中是有爭議的。我會在我的回答中加上這個。 – Stefan