如何在.NET Core 2.2中摆脱CORS?

8

我已将我的项目更新到 .net core 2.2,但似乎CORS在2.1版本中不存在的问题现在出现了。

我的应用程序运行在此URL上:http://*:5300

我在Startup.cs中添加了以下代码:

public void ConfigureServices(IServiceCollection services)
{
    ...

    services.AddCors(options =>
                     options.AddPolicy("MyPolicy", builder =>
                     {
                         builder.AllowAnyOrigin()
                                .AllowAnyMethod()
                                .AllowCredentials()
                                .AllowAnyHeader();
                     }));

    services.AddMvc();

    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...

    app.UseCors(builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowCredentials()
               .AllowAnyHeader();
    });

    app.UseAuthentication();
    app.UseMvc();
}

这个方法没有起作用,所以我在我的“BaseController”类上添加了[EnableCors]属性:

[EnableCors]
[Authorize]
[Produces("application/json")]
[Route("api/[controller]")]
public class BaseController : Controller
{

}

但我仍然遇到CORS错误:

从源'http://192.168.15.63:5302'访问'http://192.168.15.63:5301/api/permissions/UI'被CORS策略阻止:
预检请求的响应未能通过访问控制检查:
在响应中,'Access-Control-Allow-Origin'头的值在请求的凭据模式为“include”时不能是通配符'*'。
XMLHttpRequest发起的请求的凭证模式由withCredentials属性控制。

还有什么其他方法可以完全消除CORS?


你用的是什么浏览器?看起来像是这个问题:(https://dev59.com/VmIj5IYBdhLWcg3w8JRZ#19744754)。这是一个安全特性。 - Bagus Tesa
顺便说一下,我正在使用Chrome浏览器,我已经添加了这样的内容来运行我的应用程序:http://*:5300 - Liran Friedman
1个回答

9
回复如下:

请求的凭据模式为“包括”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”。

使用ASP.NET Core响应CORS请求时,不能同时使用AllowAnyOriginAllowCredentials

跨源资源共享(CORS)策略已阻止从源“http://192.168.15.63:5302”访问位于“http://192.168.15.63:5301/api/permissions/UI”的资源。

该消息显示您的服务器正在侦听http://192.168.15.63:5301,但您的客户端正在从http://192.168.15.63:5302发出请求。由于端口不同,这些是不同的来源,因此使用了CORS保护。

要允许请求成功,请将ASP.NET CORS配置代码更新为以下内容:

builder.WithOrigins("http://192.168.15.63:5302")
    .AllowAnyMethod()
    .AllowCredentials()
    .AllowAnyHeader();

这将配置客户端的来源,以支持CORS - 当然,如果需要,您可以将其作为应用程序本身的配置选项添加(例如使用appsettings.json)。


附言:

由于您已调用了AddCors并配置了一个命名策略,因此在调用UseCors时配置相同的策略是没有必要的-您只需传递之前使用AddCors配置的策略名称即可:

app.UseCors("MyPolicy");

你给出了一个精确的答案。但是我有一个疑虑。如果我在发布应用程序后知道目标(客户端IP),那么会发生什么?也就是说,我能否动态添加WithOrigin? - Sith2021
@harveyt 只需从配置文件中读取 WithOrigins 的参数。 - SwissCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接