2013-02-23 45 views
4

哪些選項可用於要由來自另一個域jQuery的應用程序所消耗的MVC3的Web API應用的認證?的ASP.NET Web API認證選項

這裏有約束/事到目前爲止,我已經試過: -

  • 我不想使用OAuth;與有限的用戶羣的專用應用我不能指望最終用戶對現有供應商的賬戶,也沒有範圍,以實現自己的
  • 我有一個全功能的HMAC-SHA256 FPGA實現使用中傳遞的數據就好了工作頭;但是,這並不在IE工作,因爲在CORS IE8/9壞了,不允許你送頭
  • 我需要跨域的消費應用程序是在不同的域的API,但不能使用JSONP監守它不允許你使用頁眉
  • 我想避免令牌(只)爲基礎的方法,因爲這是開放給重播並且通過狀態

在這一點違反了REST我辭去了HMAC-SHA256方法,它使用URL或querystring/post來提供哈希和其他變量。

在URL中把這些變量似乎只是髒了,並把它們在查詢字符串/後是一種痛苦。

我成功使用JQuery $ .ajaxSetup beforeSend選項來生成哈希並將其附加到標頭,但正如我所提到的,您不能在IE8/9中使用標頭。

現在我不得不求助於$ .ajaxPrefilter,因爲我無法更改beforeSend中的ajax數據,也無法只擴展$ .ajaxSetup中的數據,因爲我需要基於ajax查詢的類型。 $ .ajaxPrefilter也是一個問題,因爲沒有乾淨/簡單的方法來添加所需的變量,這是方法不可知的方式...即它必須是查詢字符串的GET和formdata的POST

我必須失去了一些東西,因爲我無法找到一個解決方案: - 一)支持跨域 一)不能同時在MVC和JQuery雙方 下的大規模黑客攻擊)實際上安全 d)與IE8的工作/ 9

是有人在那裏做這個正確...

編輯

爲了澄清,在API方面的認證機制是好的...不管我驗證請求哪種方式我產生的GenericPrincipal並使用該API中(這樣做的優點是另一個職位,但它確實讓我使用MVC的標準授權機制,這是我喜歡我自己的滾動...少對其他開發人員對我的API來學習和維護)

問題在於primarly在認證信息從客戶端傳輸到API: - - 它不能依賴於服務器/ API狀態。所以我不能在一次調用中傳遞用戶名/密碼,取回令牌,然後繼續使用該令牌(打開重播攻擊) - 任何需要使用請求頭的東西都沒有了,因爲IE使用XDR而不是XHR其餘的瀏覽器,它不支持自定義標題(我知道IE10支持XHR,但實際上我需要IE8 +支持) - 我想我堅持生成一個HMAC並將它傳遞到URL的某處(路徑或查詢字符串)但這看起來像一個黑客,因爲我使用的請求的部分不是爲此設計的 - 如果我使用路徑有很多混亂的解析,因爲至少我必須傳遞用戶名,時間戳和散列與每個請求;這些需要以某種方式進行分隔,我幾乎不能控制在其他地方使用的分隔符 - 如果我使用數據(querystring/formdata),我需要根據方法I更改我發送認證詳細信息的位置使用(formdata POST/PUT/etc和查詢字符串GET),我也用這些變量來應用層數據空間

儘管它不好,querystring/formdata似乎是最好的選擇;但是現在我必須弄清楚如何在每個請求上捕獲這些信息。我可以使用MessageHandler或Filter,但既不能提供便捷的方式來訪問formdata。

我知道我可以只寫所有的分析和處理自己的東西(它看起來像我這樣),但關鍵是我不相信有沒有一個解決方案了。這就像我有(1)對IE的支持,(2)安全和(3)乾淨的代碼,我只能選擇兩個。

回答

3

你我的要求似乎有點不合理。你不可能同時擁有所有的東西,你必須願意放棄某些東西。幾句話:

  • OAuth似乎是你想在這裏,至少有一些修改。您可以使用Azure的訪問控制服務,以便您不必實現自己的令牌提供程序。這樣,您就「外包」了安全令牌提供程序的實現。最後,我檢查了Azure ACS仍然是免費的。當你尋找ACS文檔時,有很多混亂因爲人們大多使用它來插入Facebook或Google之類的另一個提供商,但是你可以調整它來成爲你自己服務的一個令牌提供商。
  • 你似乎很擔心重播攻擊。重播攻擊幾乎總是有可能的。我必須只聽通過線路的數據並將其發送到您的服務器,即使通過SSL。無論如何,重播攻擊都是你需要處理的。通常,我所做的就是跟蹤即將到來的請求的緩存並將哈希簽名添加到我的緩存中。如果我在5分鐘內看到另一個具有相同散列的請求,我會忽略它。爲此,我添加請求的時間戳(毫秒粒度)和URL的一些派生作爲我的哈希參數。這允許每毫秒對同一客戶端的相同地址執行一次操作,而不會將該請求標記爲重放攻擊。
  • 你提到了jQuery,如果你使用散列方法,它會讓我困惑。這意味着你實際上在你的客戶端有你的散列算法和你的簽名邏輯。這是一個嚴重的缺陷,因爲通過檢查javascript,我現在可以確切地知道如何簽署請求並將其發送到您的服務器。
+0

Ameen,我同意你的評估,即某些要求似乎不合理,而且「不能擁有一切」。所有這些要求*一起*只會提供很少的選擇,可能沒有? @Aleks - 爲什麼不只是ASP.NET表單身份驗證?除了是一個令牌之外,它滿足您的所有其他要求。至於重播攻擊,我不確定其他方法如何更好地防止這種攻擊?例如基本身份驗證將更容易重播(或徹底的數據包嗅探)。 – Snixtor 2013-02-23 21:37:02

+0

+1作爲關於客戶端簽名的評論。這個問題確實意味着執行哈希的祕密實際上是在JavaScript中。 – 2013-02-23 21:43:59

+0

所有的有效積分... ...回覆: - 回覆OAuth ...雖然我確實可以使用Azure之類的東西,但它增加了另一個我無法控制的外部系統。我有一些非常關注安全性的客戶,這增加了不必要的複雜性; OAuth似乎對我想要達到的目標有點矯枉過正;但它是一個有效的選項 – Aleks 2013-02-23 23:46:59

1

簡單地說;在涉及到身份驗證時,ASP.NET WebAPI沒有太多特殊之處。

我可以說的是,如果你正在主持這裏面ASP.NET,您將通過ASP.NET得到認證和授權支持。如果您選擇自託管,您可以選擇啓用WCF綁定安全選項。

當主辦ASP.NET你的WebAPI,你將有幾個身份驗證選項:

  1. 基本身份驗證
  2. 窗體身份驗證 - 例如從任何ASP.Net項目可以以表單驗證
  3. Windows身份驗證使Authentication_JSON_AppService.axd - 的HttpClient/WebHttpRequest/WebClient的
  4. 或明確允許您的WebAPI的方法匿名訪問
+0

感謝您的回覆。回覆您提出的選項: - 1)不能使用基本認證;正如我在我的問題中提到的,IE中的CORS支持不允許任何額外的頭文件,身份驗證就是其中之一。 2)表單不是一個選項,因爲它是一個API,不會託管它自己的頁面。這種機制也是有狀態的,所以不適用於REST,並且它(似乎)以明文形式傳遞授權細節,並以確定性方式傳遞,這種方式對重播攻擊是開放的。 – Aleks 2013-02-23 20:34:41

+0

和... 3)儘管Windows身份驗證並不是一個真正的選項(auth需要在應用程序內部處理),但這並不能解決將身份驗證值獲取到API的問題。4)整體觀點是確保API,因此不允許匿名訪問 – Aleks 2013-02-23 20:34:59