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

112

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

startup.cs 中,我添加了以下行:

...
services.AddCors();
...
app.UseCors(builder => builder
    .AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials());

但是当我尝试在另一个Blazor项目中使用API时,在主机上的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;
}
在启用Cors之前,我在浏览器控制台中看到另一个错误。我可以更改什么来解决它?

Before I enable Cors,我看到浏览器控制台中有另一个错误

我能改变什么以解决它?


1
错误非常明显。在使用凭据时,您不能为来源指定 *。将来源设置为您服务器的实际域名。此外,这些标头必须由服务器设置,而不是在客户端标头中设置。 - user47589
根据Amy的建议,将“*”替换为“https://example.com”(包括协议)。限制只能指定一个外部域。 - estinamir
2
再次强调,这需要在服务器上设置,而不是在客户端上设置。 - user47589
2
@daniherrera @amy 我已经解决了,只需要删掉 http.DefaultRequestHeaders.Add("Access-Control-Allow-Origin", "*"); 这一行,并且在这一行: var response = await Http.GetStringAsync("https://example.com?prm=2");Http 改成 http - Igor Cova
你可以跟随这个链接,它对我有效:https://mykkon.work/how-to-setup-any-origin/ - Truc
显示剩余6条评论
7个回答

112

我曾经遇到过相同的问题,解决方法是移除 AllowCredentials() 这一行代码,此后问题就得以解决。


13
当我从Asp.Net Core 2.1升级到Asp.Net Core 3.1时,这个对我也适用。 - Ralph Willgoss
1
谢谢,从Net Core 2.2升级到Net Core 3.1时少了一个bug :) - Fellow7000
谢谢。这也是我的问题! - Calin Vlasin

62

虽然有点晚,但我希望它能对某些人有所帮助。

如果您想同时使用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));
            });

13
这应该是被接受的答案,可以同时允许AnyOrigin和Credentials。 - tomec
3
如果服务器可以公开访问,这非常危险,请参见 https://ejj.io/misconfigured-cors/。 - Mike Rosoft

61

你应该提供你代码的其余部分... 这是一个Blazor客户端应用程序还是Razor组件应用程序(早期称为服务器端Blazor)? 我猜这是一个Blazor客户端应用程序,对吗? 为什么要实例化HttpClient?相反,你应该使用DI(可能是构造函数注入),注入由Blazor本身提供的HttpClient实例。

问题可能是服务器端的,但表面上是客户端的... 尝试以下操作:

获取https://www.nuget.org/packages/Microsoft.AspNetCore.Cors/

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("CorsPolicy",
            builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
    });
     .....
}

还有这个:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)    
{
      app.UseCors("CorsPolicy");
}
注意,再次强调:CORS需要在服务器端启用,而不是在Blazor中。有关如何在ASP.NET Core中启用CORS的详细信息,请参阅https://learn.microsoft.com/en-us/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");

    }

}  
希望这能帮到你...

6
凭据不能与任何来源一起使用。请查看问题中的注释。 - user47589
1
在服务器上,我有一个 .net Core API 项目 - 现在我正在开发 Blazor 客户端项目。我的问题中显示我添加并使用 Cors。但这并没有帮助我。 - Igor Cova

50

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

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

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

对我来说这有效。


1
我不得不在Startup.cs的Configure方法下添加"app.UseCors"才能使其正常工作。 - reggaeguitar
谢谢Kurniawan Prasetyo。你的解决方案对我很有用! :) - Mily
哇,我爱你!我已经寻找类似的东西两天了! - Andrew Black

20

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

步骤2 添加

services.AddCors();

在startup.cs的ConfigureServices下

步骤3 添加

    app.UseCors(x => x
                .AllowAnyMethod()
                .AllowAnyHeader()
                .SetIsOriginAllowed(origin => true) // allow any origin
                .AllowCredentials());

在 startup.cs 文件的 Configure 方法下。


8
您不能同时使用 AllowAnyOrigin()AllowCredentials(),请将您的代码更改为:

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

2
我遇到了同样的问题,解决方法是从URL末尾删除斜杠(/),因为我总是从Chrome浏览器中复制和粘贴URL,而它在末尾有/
  .WithOrigins("https://localhost:60576/")  // not working 

但是
  .WithOrigins("https://localhost:60576")  // working  !!!

    

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