[英]How to send API requests with Windows Authentication enabled?
我正在創建一個使用 React 構建的應用程序,其中 API 個請求將從http://localhost:3000發送到位於https://localhost:5000的 .NET 服務器。 這在禁用 windows 身份驗證時有效,但是當使用 IIS 啟用 windows 身份驗證時,任何請求都會返回 401 未授權。
我做了很多研究,發現我可以通過使用 { withCredentials: true } 發送 axios 請求來發送 GET 請求。 如果我發送一個 POST 請求,這仍然會從服務器返回 401 unauthorized,除非我根據這些規范通過將內容類型設置為 application/x-www-form-urlencoded 來使請求成為“簡單請求”: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS 。
當啟用 windows 身份驗證時,我需要在 web 配置中為這些請求提供一些東西嗎?
這里對類似問題的回答對我沒有幫助: Angular 5: Post-request & windows authentication ,因為同時啟用了匿名和 windows 身份驗證,將導致對服務器的初始 GET 請求,無法獲得 Active目錄用戶名,使用 windows 身份驗證,因為匿名身份驗證似乎優先。
我可以發出內容類型設置為 application/x-www-form-urlencoded 的 POST 請求,但這似乎是 go 的錯誤方式。 有什么方法可以在服務器上設置一些設置,以便在啟用 windows 身份驗證時,位於https://localhost:5000的服務器將接受來自http://localhost:3000的內容類型為 JSON 的任何 API 請求?
您需要在服務器上設置CORS 。
同樣根據 W3C 規范, CORS 預檢請求從不包含憑據,因此您可能需要在 IIS 中為 OPTIONS 請求啟用匿名
更新:Windows Auth 與 OPTIONS 請求
由於我最近一直在為同樣的問題而苦苦掙扎,因此這里有一個小更新。
解決方案 1 (我最初鏈接的) - 添加<allow verbs="OPTIONS" users="*"/>
確實不起作用。 或者更好地說它“有點工作”,因為它需要在 IIS 中啟用匿名身份驗證,這是您在使用 Windows 身份驗證時不想要的
解決方案 2實際上確實有效。 關鍵是Application_AuthenticateRequest
里面的代碼。 同樣重要的是,它僅在使用集成管道時才有效。 它解決了 Windows 身份驗證停止 OPTIONS 請求的問題(如果您禁用匿名身份驗證,無論您做什么都會發生這種情況)
一些 MS 員工在這里和這里提到的最后一個解決方案是使用 IIS 模塊(插件) IIS CORS 。 這是配置參考和簡短但有用的介紹。
這樣做的明顯缺點是它需要安裝在每台服務器上,包括您自己的開發機器。 顯然沒有簡單的方法可以將它安裝到 IIS Express 中。 幸運的是,“混血程序員”創建了一組 PowerShell 腳本來自動執行此操作。 測試它並且它工作得很好 - 只是不要忘記 Visual Studio 在解決方案文件夾.vs\\%projectname%\\config
創建主applicationHost.config
(通常位於MyDocuments\\IISExpress\\config\\
文件夾中)的.vs\\%projectname%\\config
所以你可能需要為這個副本再次運行腳本......
結果證明是CORS問題。 我發現有趣的是,當啟用 Windows 身份驗證時,以以下兩種方式啟用 CORS 不起作用:
WebApiConfig.cs :
// Web API configuration and services
var cors = new EnableCorsAttribute("*", "*", "*") { SupportsCredentials = true };
config.EnableCors(cors);
網絡配置:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name = "Access-Control-Allow-Credentials" value="true" />
<add name = "Access-Control-Allow-Headers" value="Origin, Accept, Content-Type, X-Auth-Token" />
<add name = "Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name = "Access-Control-Max-Age" value="86400" />
</customHeaders>
</httpProtocol>
</system.webServer>
這是我不會從 API 獲得 401 未授權返回的唯一方法,是當我通過以下方式啟用 CORS 時,將其放入Global.asax.cs文件中,在預檢期間返回 200 用於 OPTIONS 請求:
public void Application_BeginRequest(object sender, EventArgs e)
{
string httpOrigin = Request.Params["HTTP_ORIGIN"];
if (httpOrigin == null) httpOrigin = "*";
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", httpOrigin);
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, X-Token");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
if (Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.StatusCode = 200;
var httpApplication = sender as HttpApplication;
httpApplication.CompleteRequest();
}
}
除了在 JavaScript 調用中包含withCredentials: true
選項外,您還必須在 REST API 配置中添加一些設置。 如果您只為 IIS 的 REST API 啟用 Windows 身份驗證,您很可能會從客戶端收到401
錯誤,因為瀏覽器在進行原始調用以驗證CORS
訪問之前進行了OPTIONS
調用。
要啟用此驗證,您還必須在 IIS 的 REST API 中啟用匿名身份驗證。
並在REST API的web.config
文件中添加這個異常:
<system.webServer>
.....
<security>
<authorization>
<add accessType="Allow" verbs="OPTIONS" users="?" />
<add accessType="Deny" verbs="GET, PUT, POST, DELETE" users="?" />
</authorization>
</security>
</system.webServer>
OPTIONS
類型的請求允許匿名身份驗證,以允許來自瀏覽器的CORS
驗證。 rest 操作拒絕匿名身份驗證: GET
、 PUT
、 POST
、 DELETE
。
您必須考慮到所有匿名調用都將啟用OPTIONS
方法,如果您要驗證身份驗證,則不應在 REST API 中使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.