如何修复“ CORS协议不允许同时指定通配符(任何)来源和凭据”错误

Igo*_*ova 13 c# .net-core blazor

我已经在C#.net Core中的项目上启用了CORS

startup.cs我添加行

...
services.AddCors();
...
app.UseCors(builder => builder
    .AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials());
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在另一个Blazor项目中使用API​​时,我在Host上我的API项目的日志中看到此错误

CORS协议不允许同时指定通配符(任何)来源和凭据。如果需要支持凭据,则通过列出各个来源来配置策略

我的代码在 Blazor

using (HttpClient http = new HttpClient()) {
  http.DefaultRequestHeaders.Add("Authorization", "Token");
   var response = await http.GetStringAsync("https://example.com?prm=2");
   Console.WriteLine(response);
   dynamicContent = response;
}
Run Code Online (Sandbox Code Playgroud)

在启用Cors之前,我在浏览器控制台中看到另一个错误

我可以为解决该问题做出哪些改变?

小智 75

我有同样的问题,我删除了AllowCredentials()它为我解决了这个问题。

  • 是的,这对我从 Asp.Net Core 2.1 升级到 Asp.Net Core 3.1 时适用 (9认同)

Con*_*sky 43

有点晚了,但我希望它可以对某人有所帮助。

如果你想AllowCredentials()AllowAnyOrigin()一起使用SetIsOriginAllowed(Func<string,bool> predicate)

关于 IsOriginAllowed 的文档

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

                options.AddPolicy("signalr",
                    builder => builder
                    .AllowAnyMethod()
                    .AllowAnyHeader()

                    .AllowCredentials()
                    .SetIsOriginAllowed(hostName => true));
            });
Run Code Online (Sandbox Code Playgroud)

  • 这应该是接受的答案,同时允许 AnyOrigin 和 Credentials。 (10认同)
  • 如果服务器可公开访问,这是非常危险的,请参阅https://ejj.io/misconfigured-cors/ (3认同)

Kur*_*tyo 38

我也遇到了同样的问题,我在这里找到了解决方案:

设置任何来源和任何凭证

像这样在 startup.cs 文件中更改 CORS 设置

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddCors(options =>
    {
        options.AddDefaultPolicy(builder => 
            builder.SetIsOriginAllowed(_ => true)
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());
    });
}
Run Code Online (Sandbox Code Playgroud)

这个对我有用。


Isa*_*aac 11

您应该已经提供了其余的代码...这是Blazor客户端应用程序还是Razor组件应用程序(正式称为服务器端Blazor)?我猜这是Blazor客户端应用程序,对吧?为什么要实例化HttpClient?您应该改用DI(也许是构造函数注入),注入Blazor本身提供的HttpClient实例。

问题可能出在服务器端,尽管它是作为客户端出现的。。。尝试以下操作:1.获取https://www.nuget.org/packages/Microsoft.AspNetCore.Cors/ 2。

 public void ConfigureServices(IServiceCollection services)
    {

        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });
         .....
    }
Run Code Online (Sandbox Code Playgroud)

和这个:

public void Configure(IApplicationBuilder app, 
                         IHostingEnvironment env)    
  {

      app.UseCors("CorsPolicy");
  }
Run Code Online (Sandbox Code Playgroud)

再次注意:CORS需要在服务器端启用,而不能启用。有关如何在ASP.NET Core中启用CORS的详细信息,请参见https://docs.microsoft.com/zh-cn/aspnet/core/security/cors

西装外套:

 @page "/<template>"
 @inject HttpClient Http


@functions {

    protected override async Task OnInitAsync()
    {
        var response= await Http.GetJsonAsync<string>    
                      ("https://example.com?prm=2");

    }

}  
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...

  • 凭证不能用于任何来源。请参阅对问题的评论。 (3认同)

小智 8

您不能同时使用两者AllowAnyOrigin()AllowCredentials()因此将代码更改为:

...
services.AddCors();
...
app.UseCors(builder => builder
    .WithOrigins("https://example.com")
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials());
Run Code Online (Sandbox Code Playgroud)


小智 8

步骤 1 安装 nuGet 包:
Microsoft.AspNetCore.Cors

步骤 2 添加

services.AddCors();
Run Code Online (Sandbox Code Playgroud)

在 Startup.cs 下的 ConfigureServices

第 3 步添加

    app.UseCors(x => x
                .AllowAnyMethod()
                .AllowAnyHeader()
                .SetIsOriginAllowed(origin => true) // allow any origin
                .AllowCredentials());
Run Code Online (Sandbox Code Playgroud)

在启动.cs 下配置