【问题标题】:.NET Core CORS issue for POST requestPOST 请求的 .NET Core CORS 问题
【发布时间】:2020-12-20 19:49:00
【问题描述】:

我的系统由两部分组成:.NET Core 2.1 后端 Web API 和 Angular 5 前端。对于所有 POST/PUT 请求,我都有一个错误:

访问 XMLHttpRequest 在 来自来源的“https://BACK_END_PATH/api/documents” “https://FRONT_END_PATH”已被 CORS 政策阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

并且为预检请求返回 HTTP 状态代码 401。

在 Angular 中,我使用 Windows 身份验证并使用凭据发送请求:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // add windows credentials
    request = request.clone({
        withCredentials: true
    });
}

我已经为所有请求、方法、标头和凭据打开了 CORS,并检查了是否在 MVC 之前应用了 CORS:

readonly string CorsAllowSpecificOrigins = "_corsAllowSpecificOrigins";

public void ConfigureServices (IServiceCollection services) 
{
    // allow CORS
    services.AddCors (options => {
        options.AddPolicy (CorsAllowSpecificOrigins,
            builder => {
                builder.AllowAnyOrigin()
                .AllowAnyHeader()
                .AllowCredentials()
                .AllowAnyMethod ();
            });
    });

    services.AddMvc (options => {
            options.Filters.Add (typeof (ModelValidatorFilter));
        })
        .SetCompatibilityVersion (CompatibilityVersion.Version_2_1);

    //comment for brevity
}

public void Configure (IApplicationBuilder app, IHostingEnvironment env) 
{
        //comment for brevity

        app.UseCors (CorsAllowSpecificOrigins);
        app.UseHttpsRedirection ();

        app.UseMvc (routes => {
            routes.MapRoute (
                name: "default",
                template: "{controller}/{action=Index}/{id?}");
        });
}

我认为问题是 'application/json' Content-Type,但 Postman 中使用了相同的类型,并且 Postman 请求工作正常。

另外,我找到了一个打开匿名用户的解决方案,但不幸的是我无法在我的系统中使用这个技巧。

Update1:​​我也试过这样设置原点:

builder.WithOrigins("https://FRONT_END_PATH")
                    .SetIsOriginAllowedToAllowWildcardSubdomains()
                    .AllowAnyHeader()
                    .AllowCredentials()
                    .AllowAnyMethod();

但错误是一样的。

【问题讨论】:

  • 如果您要使用withCredentials: true,那么您必须在具有特定来源的服务器上配置 CORS。 AllowAnyOrigin() 不会。你必须使用WithOrigins(...)docs.microsoft.com/en-us/aspnet/core/security/…
  • 这是我以前的方法,我设置了 builder.WithOrigins("FRONT_END_PATH") .SetIsOriginAllowedToAllowWildcardSubdomains() .AllowAnyHeader() .AllowCredentials() .AllowAnyMethod();但它没有用。
  • 我可以假设 FRONT_END_PATH 是客户端应用程序的完全限定 URL 吗?协议、域和端口?
  • 是的,它看起来像 sitename.com ,末尾没有斜线。

标签: angular asp.net-core .net-core cors asp.net-core-webapi


【解决方案1】:

来自this doc,您可以找到以下信息:

CORS 预检请求用于确定所请求的资源是否设置为由服务器跨源共享。并且 OPTIONS 请求始终是匿名的,如果未启用匿名身份验证,服务器将无法正确响应预检请求。

要解决此问题,如果您在本地运行应用程序以使用 CORS 进行测试,您可以尝试启用匿名身份验证。

此外,如果您的应用托管在 IIS 上,您可以尝试安装 IIS CORS module 并为应用配置 CORS。

【讨论】:

  • 很抱歉回复晚了,我没有收到任何关于答案的通知。我尝试在 web.config 中启用匿名身份验证,但没有成功,因此我创建了一个代码供管理员安装 IIS CORS 模块。我认为匿名身份验证在他们的配置中被禁止。非常感谢。
猜你喜欢
  • 2017-03-13
  • 2020-07-30
  • 2021-08-22
  • 2019-07-02
  • 2017-06-08
  • 2020-06-07
  • 2018-01-16
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多