Web API 2.1 Windows 身份驗證 CORS Firefox
這是場景:
我創建了一個 web api 項目和一個 mvc 項目,如下所示:
http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
我通過 nuget 安裝了 CORS 支持並添加了 EnableCorsAttribute
我執行了這個項目,並且在 Chrome、IE 和 FireFox 上一切正常(GET、PUT 和 POST)。
然後我在 web api 項目中啟用了 Windows 身份驗證(是的,我真的需要在 api 項目中進行 win auth)。為了讓它工作,我將 xhrFields arg 添加到我的 jquery.ajax 呼叫中:
$.ajax({ type: method, url: serviceUrl, data: JSON.stringify(foo), contentType: 'application/json; charset=UTF-8', xhrFields: { withCredentials: true } }).done(function (data) { $('#value1').text(data); }).error(function (jqXHR, textStatus, errorThrown) { $('#value1').text(jqXHR.responseText || textStatus); });另外,我設置 EnableCorsAttribute.SupportsCredentials 屬性 = true
我測試了一切。Chrome 和 IE 工作,FireFox 沒有。Firefox 收到 401 響應它的預檢 (OPTIONS) 請求。
似乎 FireFox 沒有嘗試使用該服務進行身份驗證。
有沒有人找到解決這個問題的方法?
我想出了一個兩部分的解決方案。
問題在於,當 Firefox 發出 OPTION 請求並被 401 拒絕時,它不再嘗試重新進行身份驗證。這使我走上了繞過所有 OPTION 請求的身份驗證的道路。我找不到關於這個主題的太多資訊,但我確實找到了這個:
啟用 Windows 身份驗證的 IIS 中的 CORS 請求的 401 響應(以下引用原始頁面內容)
在 Firefox 中啟用 NTLM 身份驗證(單點登錄)
本 HowTo 將描述如何在 Firefox 中啟用 NTLM 身份驗證(單點登錄)。
你們當中有多少人注意到,當您使用 Internet Explorer 並瀏覽到您公司的 Intranet 頁面時,它會自動對您進行身份驗證,但當您使用 Firefox 時,您會收到一個登錄框提示?
我最近在尋找允許使用 Apache 進行 NTLM 身份驗證的解決方案時,偶然發現瞭如何在 Firefox 中設置首選項,將 NTLM 身份驗證資訊傳遞到 Web 伺服器。首選項是 network.automatic-ntlm-auth.trusted-uris。
你是怎麼做到的?
打開 Firefox 並在地址欄中輸入“about:config”。(當然沒有引號)
在“過濾器”欄位中輸入以下“network.automatic-ntlm-auth.trusted-uris”
3)點兩下我們剛剛搜尋的首選項的名稱
- 輸入您希望將 NTLM 身份驗證資訊傳遞到的站點的 URL,格式如下:
http://intranet.company.com,http://email.company.lan
請注意,您可以在此欄位中使用逗號分隔的列表。
更新:我創建了 VBScript,可用於通過使用組策略或獨立將此資訊插入到使用者 prefs.js 文件中,如果出於某種原因您想使用它。
該腳本可在此處下載。
下載腳本後,您需要從 ZIP 存檔中提取它,然後修改以 strSiteList 開頭的行。
注意:如果使用者在執行腳本時打開了 Firefox,則此腳本將不會執行其功能。通過組策略執行腳本將毫無問題,除非由於某種原因您的組策略在執行此腳本之前啟動 Firefox。
您可以通讀腳本的其餘部分以獲取更多資訊。如果您有任何問題、意見或疑慮,請告訴我。
基於此,我在 api 項目的設置中將 Anonymous Authentication 設置為Enabled(我仍然將 Windows Authentication 設置為Enabled)。
執行項目(mvc 和 api)後,在發出 CORS 請求時提示我輸入憑據。提供我的憑據後,我能夠成功地使用 Firefox 進行 GET/POST/PUTS。
為了消除 Firefox 中的憑據提示,我收到了Brock Allen的提示,該提示引導我走上了啟用 NTLM 身份驗證的道路。我在這裡找到了一篇文章,其中提供了有關如何更改適當設置的說明。
將“
http://localhost”添加到network.negotiate-auth.trusted-uris設置後,我現在可以使用 Firefox 對所有動詞發出 CORS 請求,而無需提示輸入憑據。