在启用 Windows 身份验证的情况下,使用 ASP.NET Core 和 Aurelia(使用 http-fetch-client)设置 CORS 的正确方法是什么?

What is the correct way to setup CORS with ASP.NET Core and Aurelia (with http-fetch-client), with Windows authentication enabled?

启用 Windows (NTLM) 身份验证后,使用 ASP.NET Core 和 Aurelia http-fetch-client 发出 CORS 请求无法正常工作。 设置如下:

静态文件托管在 http://localhost:50927/

API 托管于 http://localhost:50928/

Aurelia HTTP 提取客户端已配置为使用 API 端口:

this.client = new HttpClient();
this.client.configure((config: any) => {
    config.withBaseUrl('http://localhost:50928/api/')
}

ASP.NET 核心 API 服务器已配置为在 Startup.cs

中使用 CORS
app.UseCors(builder => builder
    .AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials());

但是,当启用 Windows 身份验证时,对 API 的请求失败并且网络浏览器控制台显示以下内容

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the  remote resource at http://localhost:50928/api/sifiri/get-all-reports. (Reason: CORS header 'Access-Control-Allow-Origin' missing).[Learn More]

如果 Windows 身份验证被禁用并且仅启用匿名身份验证,则 CORS 请求可以正常工作。有什么解决办法吗?所有正确的设置似乎都已启用,除非我遗漏了什么

编辑:禁用 "Just my code" 后,控制台中显示相关异常:

Exception thrown: 'System.Net.Sockets.SocketException' in Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll
Exception thrown: 'System.Net.Sockets.SocketException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.IOException' in System.Net.Sockets.dll
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
Exception thrown: 'System.Threading.Tasks.TaskCanceledException' in System.Net.Http.dll
Exception thrown: 'System.Threading.Tasks.TaskCanceledException' in System.Private.CoreLib.dll
Exception thrown: 'System.ObjectDisposedException' in System.Net.Sockets.dll
Exception thrown: 'System.ObjectDisposedException' in System.Private.CoreLib.dll
Exception thrown: 'System.ObjectDisposedException' in System.Private.CoreLib.dll

没有提供更多信息

您只需要在进行 fetch 调用时包含 credentialsmode。这应该如下所示:

this.client
    .fetch(apiUrl, {
        mode: "cors",
        credentials: "include",
        ...
    })

有了这个,您基本上是在要求浏览器在获取请求中包含用户凭据。而且,这应该足够了,因为您已经在服务上配置了 CORS 以包括客户端 origin/header/method 等

希望对您有所帮助。