1

我有兩個應用程序,一個是桌面客戶端,另一個是可選嵌入桌面客戶端的Web應用程序。兩者都使用單獨的數據庫和單獨的用戶驗證機制與單獨的服務器通信服務器可以相互通信。客戶端服務器和Web應用程序之間的身份驗證

我需要能夠登錄到桌面應用程序並使用嵌入式Web應用程序,而無需輸入Web客戶端的用戶名/密碼。

網絡應用程序是在我們這邊開發的,所以可以進行重大更改(在合理範圍內)。架構是Windows上的.NET(IIS和SQL Server)。
桌面應用程序是在別處開發的,所以更改應該儘可能少;使http請求和傳遞一個令牌是好的,但創建一個新的認證機制不是。架構不明,解決方案應該是平臺獨立的。

我可以在兩臺服務器之間使用某種信任來創建一次性身份驗證令牌,桌面客戶端可以將這種令牌傳遞給Web客戶端以創建會話?

這個或其他類似用例可以插入嗎?請注意,不得要求互聯網連接,只保證訪問兩臺服務器。

如果沒有任何容易/快速/免費的解決方案,我想是這樣的(d是桌面應用程序,W是Web應用程序):在給客戶d

  1. 用戶登錄並希望打開客戶端W¯¯
  2. 服務器d要求服務器W爲特定用戶
  3. 服務器W令牌創建新的令牌,在內部把它映射到所請求的用戶名和到客戶端返回令牌
  4. 客戶d日誌W¯¯使用用戶名和標記
  5. 服務器W創建一個新的會話,而忘記了令牌,因此它不能再被使用

服務器之間的流量將通過SSL/TLS,IP白名單中,使用預配置的密碼認證,包括獨特的計數器和時間戳防止重播攻擊。
桌面客戶端將通過嵌入式瀏覽器向服務器發送請求,從而與Web應用程序通信。對於身份驗證,它將HTTPS POST用戶名和令牌到登錄頁面。
客戶端與其代表服務器之間的通信被認爲是安全的。

有什麼我仍然失蹤?

謝謝。

回答

1

我認爲最不顯眼的解決方案是最好的。我喜歡模塊化身份驗證的想法,您可以輕鬆地使用新的身份驗證方法。您只需擁有兩個活動的認證模塊。

讓我們來看看服務器d:

  1. 用戶名/密碼認證。你取用戶名和密碼,並對數據庫中的內容進行驗證(或希望其散列),並返回令牌。帶有返回令牌的請求將會成功,直到令牌過期。
  2. 同行認證。您從請求中獲取給定的會話標記並將其提交給服務器W進行驗證。如果服務器W不返回200,您應該禁止訪問。這也是共享會話數據的好機會。

看來你已經在想這個道路了,但是我建議你不要讓服務器互相問對方的標記。而是讓服務器使用對該服務器有效的令牌相互詢問會話數據。如果使用服務器D上的用戶/傳遞進行登錄,請讓服務器D爲您提供一個對服務器D有效的會話令牌。然後,當與服務器W通信時,如果給定的會話令牌有效,讓服務器W詢問服務器D.服務器D可以簡單地返回yes/no或返回給定令牌的所有公共會話數據。

該解決方案擁有超過您提出了一個至少有兩個好處:

  1. 你不必讓兩個記號。您只需將使用用戶/通行證進行身份驗證的最後一個服務器的任何標記存儲給您。這也使您能夠像處理服務器一樣處理服務器,如果您希望更改auth方法,將來可以使用更多的靈活性。
  2. 令牌過期更直接。你不會有失配的失效處理。無論何時您的單個令牌過期,您都不再通過任一服務器進行身份驗證。

您怎麼看?合理?

順便說一句,我認爲SSL可以防止重放攻擊。

+0

不錯,這是更清潔!此外,感謝有關SSL和重播攻擊的領導:) – 2014-10-28 13:56:54

相關問題