angularjs Cors with SignalR -解决“The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' error”(响应中的“Access-Control-Allow-Origin”头的值不能是通配符“*”)错误

ds97pgxw  于 2023-09-30  发布在  Angular
关注(0)|答案(4)|浏览(462)

我正在使用Angular 2和ASP.NET Core与SignalR。
我的错误如下所示:
XMLHttpRequest无法加载http://localhost:55916/signalr//signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22event%22%7D%5D&_=1486394845411。当请求的凭据模式为“include”时,响应中“Access-Control-Allow-Origin”标头的值不能为通配符“*”。因此,不允许访问源“http://localhost:8080”。XMLHttpRequest发起的请求的凭据模式由withCredentials属性控制。
下面是我的app配置:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["data:secretKey"]));

            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();
                        

            app.UseCors(config =>
                 config.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());

            app.UseWebSockets();
            app.UseSignalR("/signalr");

            app.UseMvc();
        }

Angular 2 SignalR服务

constructor(){
 //setups...

  this.connection = $.hubConnection(this.baseUrl + 'signalr/');
    this.proxy = this.connection.createHubProxy(this.proxyName);

    this.registerOnServerEvents();

    this.startConnection();
}

注册服务器事件:

private registerOnServerEvents(): void {
        this.proxy.on('FoodAdded', (data: any) => {
            debugger;
            this.foodchanged.emit(data);
        });

        this.proxy.on('FoodDeleted', (data: any) => {
            debugger;
            this.foodchanged.emit('this could be data');
        });

        this.proxy.on('FoodUpdated', (data: any) => {
            debugger;
            this.foodchanged.emit('this could be data');
        });

        this.proxy.on('SendMessage', (data: ChatMessage) => {
            debugger;
            console.log('received in SignalRService: ' + JSON.stringify(data));
            this.messageReceived.emit(data);
        });

        this.proxy.on('newCpuValue', (data: number) => {
            debugger;
            this.newCpuValue.emit(data);
        });
    }

错误从开头开始。

ebdffaop

ebdffaop1#

我想通了。在客户端设置连接时,我必须添加
带证书
属性为false
代码如下:

private startConnection(): void {
    this.connection.start({ withCredentials: false }).done((data: any) => {
        this.connectionEstablished.emit(true);
        this.connectionExists = true;
    }).fail((error: any) => this.connectionEstablished.emit(false));
}
ctehm74n

ctehm74n2#

这对我很有效

app.UseCors(config => config.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials());

必须添加AllowCredentials选项

hfyxw5xn

hfyxw5xn3#

只要在应用程序中使用凭据安全性,您就应该指定CORS请求可能来自的域:

app.UseCors(config => config.WithOrigins("http://localhost:8080"));

如果您允许来自世界上任何域的CORS请求,则凭证安全性的价值将大大降低。这就是错误信息告诉我们的。

doinxwow

doinxwow4#

在.Net 7中,如果要使用AllowAnyOrigin,则需要在JavaScript中将withCredentials属性设置为false。
所以,下一个代码将在.Net 7中工作。
.Net部分:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(
        builder =>
        {
            builder
                .AllowAnyOrigin()
                .AllowAnyHeader()
                .AllowAnyMethod();
        });
});

builder.Services.AddSignalR(o =>
{
    o.EnableDetailedErrors = true;
});

var app = builder.Build();

app.UseCors();

app.UseDefaultFiles();

app.UseStaticFiles();

app.MapHub<MessageHub>("/messageHub");

示例化连接的JS部分:

var connection = new signalR.HubConnectionBuilder()
.withUrl("URL_TO_SERVER/messageHub", { withCredentials: false })
.build();

所以,诀窍是传递选项**{ withCredentials:false }withUrl**方法。

相关问题