2010-04-05 142 views
0

我有一組半公共REST API的,我們正在建立一個簡單的身份驗證方案:WCF基於REST的服務的身份驗證方案

    /-----------------------\ 
        | Client POST's ID/Pass | 
        | to an Auth Service | 
        \-----------------------/ 
    [Client] ------------POST----------------------> [Service/Authenticate] 
                  | 
              /-------------------------------\ 
              | Service checks credentials | 
    [Client] <---------Session Cookie------- | and generates a session token | 
     |          |   in a cookie.   | 
     |          \-------------------------------/ 
     | 
    [Client] -----------GET /w Cookie -------------> [Service/Something] 
           |           
       /----------------------------------\ 
       | Client must pass session cookie | 
       |  with each API request  | 
       |  or will get a 401.   | 
       \----------------------------------/ 

這工作很好,因爲客戶端永遠不會需要做的只是得到了什麼一cookie,然後傳給它。對於瀏覽器應用程序,這是瀏覽器自動發生的,對於非瀏覽器應用程序,保存cookie並將其與每個請求一起發送非常簡單。

但是,我還沒有想出一個從瀏覽器應用程序進行初始握手的好方法。例如,如果這一切都是使用AJAX技術進行的,那麼阻止用戶訪問ID/Pass客戶端的用途是與服務握手?

這似乎是這是這種方法的唯一絆腳石,我很難過。

+0

你到底想要保護什麼? 這聽起來像「客戶端」和「用戶」是不同的演員,你試圖掩蓋「客戶端」具有硬編碼憑證這一事實嗎? 如果「用戶」和「客戶端」對同一臺計算機具有相同的訪問權限,那麼現在就可以通過默默無聞的方式實現安全性。其次,對於API,如果您要使用身份驗證/授權方案,我強烈建議您考慮使用OAuth而不是自行創建。 – 2010-04-05 01:28:45

+0

正確的說,客戶端是另一個想要使用我們內容的網站,他們可能希望通過REST/JSONP來完成這個客戶端。我想我的主要希望是能夠控制使用我們API的各種第三方。 – FlySwat 2010-04-05 01:33:44

回答

1

一種可能性是爲每個服務器AJAX頁面生成一次性填充,並將該填充附加到會話cookie。現在用戶無法在沒有一次性鍵盤的情況下啓動會話。當然,他們可以請求一個新的頁面來獲得墊。

0

您無法獲得此類服務。 This thread討論了一些方法,但它們都不是一個好的解決方案。

如果要使用API​​控制第三方,強制他們使用服務器到服務器的連接。