簡體   English   中英

如何在啟用 Windows 身份驗證的情況下發送 API 請求?

[英]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

以下是如何在 Web API 2 中執行此操作的一些資源

同樣根據 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調用。

來自瀏覽器的 OPTIONS 方法調用

要啟用此驗證,您還必須在 IIS 的 REST API 中啟用匿名身份驗證

從 IIS 啟用身份驗證

並在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 操作拒絕匿名身份驗證: GETPUTPOSTDELETE

您必須考慮到所有匿名調用都將啟用OPTIONS方法,如果您要驗證身份驗證,則不應在 REST API 中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM