我們有一個基於用戶名和密碼處理授權的服務。我們不把用戶名和密碼作爲調用的一部分,而是放在SOAP頭中。這個WebService安全方案有哪些潛在的問題?
在典型的情況下,Web服務在執行開始時調用授權服務,以檢查是否允許調用者調用它。問題在於這些Web服務中的一些互相調用,這意味着在每個子調用中都會檢查用戶的權限,而且這可能非常昂貴。
我想要做的是讓授權服務在第一次調用後返回一個安全令牌。然後,Web服務不必每次都調用授權服務,而是可以在本地驗證安全標頭。
安全頭看起來像這樣(C#代碼 - 修剪來說明基本概念):
public sealed class SecurityHeader : SoapHeader
{
public string UserId; // Encrypted
public string Password; // Encrypted; Just realized this field isn't necessary [thanks CJP]
public DateTime TimeStamp; // Used for calculating header Expiry
public string SecurityToken;
}
總的想法是,SecurityHeader獲取與每個呼叫檢查。如果它存在,尚未過期,且SecurityToken有效,則Web方法正常進行。否則,它將返回一個錯誤,或者它將嘗試重新授權並生成一個新的SecurityHeader SecurityToken基於UserId,Password和TimeStamp的鹽味散列。每天更換鹽以防止重放。
我所看到的一個問題是,用戶可能有權訪問Web服務A,但不能訪問Web服務B.如果他調用A並收到安全令牌,就像現在這樣,這意味着B會讓他如果他使用相同的標記。我必須對其進行更改,以便安全令牌僅從Web服務到Web服務而不是Web服務即用戶有效。如果用戶調用A調用B,應該是可以的,但如果用戶調用服務A然後調用服務D,則不是OK。解決此問題的方法是將一個公用密鑰(或一組密鑰)分配給邏輯上相關的服務。 (即,如果客戶可以做A,那麼他在邏輯上也可以做B)。
或者,我必須將用戶的整個權限集編碼爲安全性頭的一部分。我將不得不調查開銷是多少。
編輯:
幾個人都提到尋找其他安全方案,例如WS-Security和SAML等我已經有了。事實上,我從WS-Security獲得了這個想法。問題是其他方案不提供我需要的功能(緩存授權信息並防止沒有中間數據庫的重放)。如果有人知道一個方案,那麼我會反過來使用它。此外,這是關於認證的而不是。這是由我無法控制的另一種機制處理的。
如果事實證明無法緩存授權數據,那麼這意味着我只需承擔每個級別的授權開銷。
SAML聲明如下所示: 「客戶端X具有角色A和B.此聲明在時間T有效,簽名,AuthService」。 這不是你所需要的? – ykaganovich 2008-10-05 22:18:31
今天我將重新訪問SAML和XACML。 – ilitirit 2008-10-08 12:16:24