Asp.net

Web API 2.1 Windows 身份驗證 CORS Firefox

  • September 13, 2019

這是場景:

我創建了一個 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。

你是怎麼做到的?

  1. 打開 Firefox 並在地址欄中輸入“about:config”。(當然沒有引號)

  2. 在“過濾器”欄位中輸入以下“network.automatic-ntlm-auth.trusted-uris”

3)點兩下我們剛剛搜尋的首選項的名稱

  1. 輸入您希望將 NTLM 身份驗證資訊傳遞到的站點的 URL,格式如下:
http://intranet.company.com,http://email.company.lan
  1. 請注意,您可以在此欄位中使用逗號分隔的列表。

  2. 更新:我創建了 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 請求,而無需提示輸入憑據。

引用自:https://stackoverflow.com/questions/22183384