Net Core WebSockets HTTP身份验证失败

时间:2020-11-02 19:48:58

标签: angular .net-core websocket windows-authentication

我有.net core 2.1后端和angular 5前端应用程序。我为应用程序实现了网络套接字,并且在本地它可以正常工作,但是在服务器上,我遇到了下一个错误:

与'wss://back-end-server.com/ws'的WebSocket连接失败:HTTP身份验证失败;没有有效的凭据

当客户端尝试重新连接时,我会得到:

与'wss://back-end-server.com/ws'的WebSocket连接失败:WebSocket握手期间出错:'Sec-WebSocket-Accept'标头值不正确

客户端使用rxjs websockets连接到服务器:

#standardSQL
select 
  regexp_extract(line, r'"startstr' || pattern) start,
  regexp_extract(line, r'"endstr' || pattern) `end`,
from `project.dataset.table` t, 
  unnest([to_json_string(t)]) line,
  unnest(generate_array(0, array_length(split(line))/3 - 1)) index,
  unnest([if(index > 0, cast(index as string), '') || '":"?([^,"]+)"?']) pattern
where regexp_extract(line, r'"strcol' || pattern) = cast(1012 as string)

所有请求都使用Windows凭据拦截器包装:

private connect(): void {
    this.websocket$ = new WebSocketSubject(this.config);

    this.websocket$.subscribe(
        (message: any) => {
            this.wsMessages$.next(message);
        },
        (error: Event) => {
            console.log(`Websocket connection error: ${error.target}`);
            if (!this.websocket$) {
                // run reconnect if errors
                this.reconnect();
            }
        });
}

这是我的后端Startup.cs的摘录

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    request = request.clone({
        withCredentials: true
    });
    return next.handle(request);
}

NotificationsMessageHandler:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseWebSockets();
    var serviceScopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
    var serviceProvider = serviceScopeFactory.CreateScope().ServiceProvider;
    app.MapWebSocketManager("/ws", serviceProvider.GetService<NotificationsMessageHandler>());
    ...

我的客户端和服务器位于具有Windows身份验证并启用了CORS的不同服务器上:

public override async Task OnConnected(WebSocket socket)
{
    await base.OnConnected(socket);

    var socketId = WebSocketConnectionManager.GetId(socket);
    await SendMessageToAllAsync(JsonConvert.SerializeObject($"{socketId} is now connected"));
}
对于预检请求,

anonymousAuthentication已打开。

我已经检查了IIS是否已安装WebSockets。我还能尝试什么? 预先谢谢你。

0 个答案:

没有答案
相关问题