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

Posted

技术标签:

【中文标题】如何修复“CORS 协议不允许同时指定通配符(任何)来源和凭据”错误【英文标题】:How to fix "The CORS protocol does not allow specifying a wildcard (any) origin and credentials at the same time" error 【发布时间】:2019-05-09 14:14:03 【问题描述】:

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

startup.cs我添加了行

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

但是当我尝试在另一个 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;

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

我可以改变什么来解决它?

【问题讨论】:

错误很明显。使用凭据时,您不能为来源指定 *。将源设置为您服务器的实际域名。此外,这些标头必须由服务器设置,而不是在您的客户端标头中。 @Amy 还有什么解决方案? 我已经告诉过你解决方案,错误信息也是如此。同样,“将来源设置为您服务器的实际域名。” 同样,这需要在服务器上设置,而不是在您的客户端。 @daniherrera @amy 我已经解决了,只需删除http.DefaultRequestHeaders.Add("Access-Control-Allow-Origin", "*"); 并将var response = await Http.GetStringAsync("https://example.com?prm=2"); 行中的Http 更改为http 【参考方案1】:

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

【讨论】:

是的,这适用于我从 Asp.Net Core 2.1 升级到 Asp.Net Core 3.1 时 谢谢,从 Net Core 2.2 升级到 Net Core 3.1 时少了一个错误 :) 谢谢。这也是我的问题!【参考方案2】:

您应该已经提供了其余代码... 这是 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://docs.microsoft.com/en-us/aspnet/core/security/cors。

Blazor:

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


@functions 

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

    

  

希望这会有所帮助...

【讨论】:

凭证不能用于任何来源。请参阅有关问题的 cmets。 在服务器上,我有 .net Core API 项目 - 现在我开发 Blazor 客户端项目。在我的问题中显示我添加和使用 Cors。这对我没有帮助【参考方案3】:

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

如果您想同时使用 AllowCredentials()AllowAnyOrigin(),只需使用 SetIsOriginAllowed(Func&lt;string,bool&gt; predicate)

doc about IsOriginAllowed

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

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

                    .AllowCredentials()
                    .SetIsOriginAllowed(hostName => true));
            );

【讨论】:

这应该是被接受的答案,同时允许 AnyOrigin 和 Credentials。 如果服务器可以公开访问,这是非常危险的,请参阅ejj.io/misconfigured-cors【参考方案4】:

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

Setup Any Origin And Any Credentials

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

public void ConfigureServices(IServiceCollection services)

    // ...
    services.AddCors(options =>
    
        options.AddDefaultPolicy(builder => 
            builder.SetIsOriginAllowed(_ => true)
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());
    );

它对我有用。

【讨论】:

我必须在 Startup.cs 的配置下添加“app.UseCors”才能使其正常工作 感谢 Kurniawan Prasetyo。您的解决方案对我有用! :) 天啊,我爱你,过去 2 天我一直在寻找类似的东西!【参考方案5】:

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

第 2 步 添加

services.AddCors();

在 ConfigureServices 下的 startup.cs 中

第 3 步 添加

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

在配置下的startup.cs中

【讨论】:

【参考方案6】:

您不能同时使用AllowAnyOrigin()AllowCredentials() 所以将您的代码更改为:

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

【讨论】:

【参考方案7】:

我遇到了同样的问题,通过从 URL 的结尾删除 slash( / ) 解决了这个问题,因为我总是从 chrome 浏览器复制和粘贴 url它的末尾有 /

  .WithOrigins("https://localhost:60576/")  // not working 

但是

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

    

【讨论】:

以上是关于如何修复“CORS 协议不允许同时指定通配符(任何)来源和凭据”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞