Actualmente me estoy arrancando los pelos en el trabajo tratando de resolver un problema con una aplicación web que usa SignalR sobre WebSockets donde el tráfico se dirige a través de un firewall de aplicaciones web (WAF) Barracuda. Cada intento de conectarse al signalr/connect
punto final mediante websockets fallaría con una solicitud incorrecta 400. Luego, la conexión se revierte al sondeo del servidor web, que funciona, pero no es lo que queremos.
Las solicitudes realizadas se envían a nuestro Firewall de aplicaciones web Barracuda y luego a nuestros servidores web IIS con carga equilibrada. Estamos utilizando IIS 8.5 en Windows Server 2012R2 y la aplicación es una aplicación web .Net 4.6.2.
La misma configuración (sin usar un Barracuda WAF) funciona sin problemas.
Hasta ahora tengo
Websockets habilitados en WAF según este artículohttps://campus.barracuda.com/product/webapplicationfirewall/doc/49054741/how-to-enable-websocket. Sigo recibiendo el mismo error 400.
Verificado para asegurarme de que mis servidores IIS tengan la WebSocket
función habilitada.
Se activó la depuración/rastreo de SignalR en Web.Config segúnhttps://docs.microsoft.com/en-us/aspnet/signalr/overview/testing-and-debugging/enabling-signalr-tracing. Esto genera archivos de registro, pero ninguno indica errores.
¿No estoy seguro de qué más comprobar?
Respuesta1
Entonces descubrí mi problema. Descubrí que en realidad primero estamos enviando nuestro tráfico a nuestro WAF a través de Azure Load Balancer. Cuando cierro sesión en los encabezados en los registros de acceso WAF, puedo ver que el Connection
encabezado no tiene valor, lo cual sé que mi cliente envía como Upgrade
.
Parece ser un problema al utilizar Azure Load Balancer. Así que, en su lugar, estoy investigando el uso de Azure Application Gateway.
Por el momento, sin embargo, puedo hacer que esto funcione haciendo que WAF agregue el Connection
encabezado por mí, configurando una regla de reescritura de encabezado para enviar este encabezado a mis servidores IIS.
Encabezados requeridos para WebSockets
Connection: Upgrade Upgrade: websockets
- Abra el sitio de administración de Barracuda WAF.
- Vaya al sitio web -> Traducciones del sitio web
En Reescritura de solicitud HTTP, agregue una nueva regla de reescritura...
- Especifique un nombre de regla.
- Establezca un número de secuencia.
- Seleccione Reescribir encabezado como acción.
- Ingrese Conexión como Nombre del encabezado.
- Utilice * como valor anterior, que reemplazará cualquier valor.
- Ingrese actualización como valor de Reescritura, para que se envíe este en su lugar.
- Úselo
Header Upgrade eq websocket
como condición de reescritura. Esto ahora sólo aplicará la regla cuando elUpgrade
encabezado contenga el valorwebsocket
. - Haga clic en Agregar.
Ahora, cuando intento cargar la aplicación nuevamente y ¡boom, la conexión fue exitosa a /signalr/connect con el transporte webSockets!
Más información está disponible en mientrada en el blog