如何修复“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<string,bool> 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 协议不允许同时指定通配符(任何)来源和凭据”错误的主要内容,如果未能解决你的问题,请参考以下文章