如何解决 AJAX POST 到 .NET Core 6.0 REST API 中的 COR 问题?

问题描述 投票:0回答:1

我有一个 ASP.NET 网站(不是 Web 应用程序),它使用 JQuery 2.1.4 对 ASP.NET 6.0 REST API 进行 AJAX POST 调用。

当我调用该方法时,我收到 COR 错误。 然而,当我向同一控制器中的不同方法发出 GET AJAX 请求时,请求成功。

我的 AJAX 帖子:

function insertLNItemStorageRequirement() {
            

            var tempLNStorage = {
                TItem: storageTempReq.t_item,
                TSrq1: storageTempReq.t_srq1,
                TSrq2: storageTempReq.t_srq2,
                TSq27: storageTempReq.t_sq27,
                TStmp: storageTempReq.t_stmp,
                TRcdVers: 0,
                TRefcntd: 0,
                TRefcntu: 0,
            };

            $.ajax({
                type: "POST",
                url: commonAPIURL + "api/LN/InsertItemStorageRequirement",
                data: JSON.stringify(tempLNStorage),
                contentType: 'application/json; charset=utf-8',
                //dataType: "json",
                xhrFields: {withCredentials: true},
                success: function (response) {

                },
                failure: function (response) {
                    alert(response.responseText);
                },
                error: function (response) {
                    alert(response.responseText);
                }
            });
        }

这是正在调用的 .NET REST API 方法:

 [HttpPost("InsertItemStorageRequirement")]
        [Produces(typeof(IActionResult))]
        public IActionResult InsertItemStorageRequirement([FromBody] Ttccgs016424 itemStorageReq)
        {
            Ttccgs016424 newItemStorageReq = _LN.Ttccgs016424s.FirstOrDefault(s => s.TItem == itemStorageReq.TItem);

            if (newItemStorageReq == null)
            {
                newItemStorageReq = new Ttccgs016424()
                {
                    TItem = itemStorageReq.TItem,
                    TSrq1 = itemStorageReq.TSrq1,
                    TSrq2 = itemStorageReq.TSrq2,
                    TSq27 = itemStorageReq.TSq27,
                    TStmp = itemStorageReq.TStmp,
                    TRcdVers = itemStorageReq.TRcdVers,
                    TRefcntd = itemStorageReq.TRefcntd,
                    TRefcntu = itemStorageReq.TRefcntu
                };

                try
                {
                    _LN.Ttccgs016424s.Add(newItemStorageReq);
                    _LN.SaveChanges();
                }
                catch (Exception ex)
                {
                    return BadRequest(ex.Message);  
                }

                return StatusCode(StatusCodes.Status201Created);
            }
            else
            {
                return StatusCode(StatusCodes.Status412PreconditionFailed, "Item Storage Requirement already exists.");
            }
        }

这是我的startup.cs中API的COR配置(请注意,我的origin是origins数组的一部分):

services.AddCors(setup => {
    setup.DefaultPolicyName = "open";
    setup.AddDefaultPolicy(p => {
        p.AllowAnyHeader();
        p.WithMethods("OPTIONS", "GET", "POST", "PUT", "DELETE");
        p.WithOrigins(origins);
        p.AllowCredentials();
     });
});

发送的请求标头:

OPTIONS /api/LN/InsertItemStorageRequirement HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:31227
Origin: http://localhost:14612
Referer: http://localhost:14612/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36 Edg/128.0.0.0

回应:

HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/10.0
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Wed, 11 Sep 2024 23:43:25 GMT
Content-Length: 5995


我尝试更改 AJAX 调用以使用“credentials: 'include'”。

并尝试更改“data: '{itemStorageReq: "' + JSON.stringify(tempLNStorage) + '"}'。

都没有成功向 API 发送 POST。

对 API 的同一控制器中的不同方法的 GET 请求会成功。

我怀疑这并不是真正的 COR 问题,而是 AJAX 发送的数据与 API 期望的数据不匹配。

关于如何解决此问题有什么建议吗?

谢谢你。

jquery asp.net ajax asp.net-core cors
1个回答
0
投票

您共享的错误消息包含

WWW-Authenticate: NTLM
,因此不包含 Windows 身份验证凭据的预检请求将被阻止并收到 401 错误。由于预检请求无法获取所需的 CORS 策略,因此 POST 请求获取 CORS 错误是预期的行为。类似于这张票

由于您在本地工作,解决方法是允许匿名。在您的 API 项目

launchsettings.json
中,您可能需要如下设置
"anonymousAuthentication": true

{
  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": true,
}
© www.soinside.com 2019 - 2024. All rights reserved.