在 C# WebAPI 中,如何配置 CORS 以允许带有凭据和 json 内容的 POST 请求?

Posted

技术标签:

【中文标题】在 C# WebAPI 中,如何配置 CORS 以允许带有凭据和 json 内容的 POST 请求?【英文标题】:In C# WebAPI, how do I configure CORS to allow a POST request with credentials and json content? 【发布时间】:2020-01-17 19:24:09 【问题描述】:

我的 WebAPI web.config 中有以下标头:


  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="https://localhost:44379" />
      <add name="Access-Control-Allow-Methods" value="*" />
      <add name="Access-Control-Allow-Headers" value="X-Requested-With, content-type, Accept, Origin, Authorization, User-Agent, Referer" />
      <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
  </httpProtocol>

当我在前端发送以下 POST 调用时,出现错误:

"CORS 策略阻止了从源 'https://server-name/Grouping/api/Grouping/GetGroupByProcessId' 获取 'https://server-name/Grouping/api/Grouping/GetGroupByProcessId' 的访问权限:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。 "

选项https://server-name/Grouping/api/Grouping/GetGroupByProcessId401(未经授权)


var headers = new Headers();

            headers.append("Content-Type", "application/json");
            headers.append("Accept", "application/json");

            fetch("https://<host-name>/Grouping/api/Grouping/GetGroupByProcessId", 
                method: "POST",
                 credentials: "include",
                headers: headers,
                body: JSON.stringify( GroupingValue: groupingValue ) //groupingValue is just a JSON array
            )
                .then(res => res.json())
                .then(data => console.log(data))

检查控制台中的响应和请求标头,我看到以下内容,一切看起来都很好。

我似乎无法弄清楚为什么我不断收到未经授权的消息。 我的 GET 请求进行得很好。

This answer 建议您可以在帖子中发送 JSON,但我有 Allow-Headers 的标头,但它仍然无法正常工作。任何帮助,将不胜感激!

【问题讨论】:

见blogs.msmvps.com/kenlin/2018/01/18/2694 在您的WebApiConfig.cs 文件中,在Register 方法下,添加以下内容:EnableCorsAttribute cors = new EnableCorsAttribute("http://localhost:44379", "*", "GET,POST"); config.EnableCors(cors); 【参考方案1】:

打开文件 App_Start/WebApiConfig.cs。将以下代码添加到 WebApiConfig.Register 方法中:

public static class WebApiConfig
    
        public static void Register(HttpConfiguration config)
        
            // New code
            config.EnableCors();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/controller/id",
                defaults: new  id = RouteParameter.Optional 
            );
        
    

接下来,将 [EnableCors] 属性添加到 TestController 类:

using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;

namespace WebService.Controllers

    [EnableCors(origins: "http://host-name.com", headers: "*", methods: "*")]
    public class TestController : ApiController
    
        // Controller methods not shown...
    

【讨论】:

以上是关于在 C# WebAPI 中,如何配置 CORS 以允许带有凭据和 json 内容的 POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

IIS 中托管的 WebAPI 中的 CORS 问题

如何使用 .NET Core 2 配置 Angular 6 以允许来自任何主机的 CORS?

CORS 问题 Angular4 & c# web api

WebApi使用cors配置跨域问题

如何在 Asp.Net Core 3.0 WebAPI 中启用 CORS

cors c# web API react