Si estás emocionado por recarga caliente como yo Y tu tambien quiero una calificación de “A” de SecurityHeaders.com (de verdad, intenta esto ahora) entonces aprenderás muy rápido sobre Política de seguridad de contenido encabezados Necesita pasar algún tiempo leyendo y puede terminar con una lista un tanto sofisticada de cosas permitidas, scripts, hojas de estilo, and many others.
En Núcleo de DasBlog (el motor de weblog multiplataforma que ejecuta este weblog) Mark Downie los hace configurables y usa la biblioteca NWebSpec ASP.NET Middleware para agregar los encabezados necesarios.
if (SecurityStyleSources != null && SecurityScriptSources != null && DefaultSources != null)
{
app.UseCsp(choices => choices
.DefaultSources(s => s.Self()
.CustomSources(DefaultSources)
)
.StyleSources(s => s.Self()
.CustomSources(SecurityStyleSources)
.UnsafeInline()
)
.ScriptSources(s => s.Self()
.CustomSources(SecurityScriptSources)
.UnsafeInline()
.UnsafeEval()
)
);
}
Cada una de esas variables sale de un archivo de configuración. Sí, sería más seguro si salieran de una bóveda o incluso estuvieran codificados.
DasBlog es una aplicación bastante grande y genial y notamos inmediatamente después de que Mark la actualizó a .NET 6 que no podíamos usar Sizzling Reload (a través de dotnet watch o de VS 2022). ¡Podemos quejarnos o podemos aprender cómo funciona y por qué no funciona para nosotros!
Recordar: Nada en tu computadora está oculto para ti.
Comenzando con un easy “Ver fuente”, podemos ver un JavaScript incluido en la parte inferior que definitivamente no es mío.
<script src="http://feeds.hanselman.com/_framework/aspnetcore-browser-refresh.js"></script>
De acuerdo, esto tiene sentido, ya que sabemos que HotReload no solo es suitable con C# (código detrás), sino también con Markup a través de Razor Pages y cambiando CSS. Definitivamente necesitaría comunicarse “de vuelta a casa” con el corredor, que es “dotnet watch” o VS2022.
Si cambio ASPNETCORE_ENVIRONMENT a “Producción” (ya sea a través de launch.json, launchsettings o una variable de entorno como esta, puedo ver que la secuencia de comandos auxiliar HotReload adicional no está allí:
C:githubwshotreloadtest>dotnet run --environment="Manufacturing"
Constructing...
information: Microsoft.Internet hosting.Lifetime(14)
Now listening on: https://localhost:7216
information: Microsoft.Internet hosting.Lifetime(14)
Now listening on: http://localhost:5216
Recordar: ¡Nunca querrás usar dotnet run en producción! ¡Es un comando de creación de SDK! Querrás usar dotnet exec your.dll, dotnet your.dll, o lo mejor de todo, en .NET 6 ¡simplemente llama al EXE directamente! .binDebugnet6.0wshotreloadtest.exe en mi ejemplo. ¿Por qué? dotnet run siempre asumirá que está en desarrollo (literalmente le cube que restaure, compile y ejecute en un comando de ejecución) si lo ejecuta. Notarás que ejecutar el EXE actual siempre es MUCHO más rápido también. ¡No envíe su SDK de .NET a su servidor internet y no vuelva a compilar todo al iniciar en producción!
Podemos ver que aspnnetcore-browser-refresh.js es el lado del cliente de Growth-time HotReload. Mirando la consola de nuestro navegador vemos:
Refused to hook up with 'wss://localhost:62486/'
as a result of it violates the next Content material Safety Coverage
directive: "default-src 'self'".
Observe that 'connect-src' was not explicitly set,
so 'default-src' is used as a fallback.
Eso es mucho en lo que pensar. Comencé con el software program intermedio de mi aplicación internet ASP.NET diciendo que estaba bien hablar “de nuevo conmigo mismo”, pero en ningún otro lugar.
app.UseCsp(choices => choices.DefaultSources(s => s.Self()));
Hm, parece razonable, ¿por qué el navegador no puede volver a conectarse al servidor internet Kestrel ejecutado por dotnet? Es todo localhost, ¿verdad? Bueno, específicamente es http://localhost, no ws://localhost, o incluso wss://localhost (esa s adicional es para seguridad), por lo que necesito permitir explícitamente ws: o wss: o ambos, pero solo en Desarrollo.
Tal vez así (nuevamente, estoy usando NWebSpec, pero estos son solo encabezados HTTP, por lo que literalmente puede agregarlos si lo desea, codificados).
app.UseCsp(choices => choices.DefaultSources(s => s.Self())
.ConnectSources(s => s.CustomSources("wss://localhost:62895")));
Pero los números de puerto cambian, ¿verdad? Hagamos solo wss:, solo en Desarrollo. Ahora, si estoy usando CSP y WebSockets (ws:, wss:) en producción, tendré que ser intencional al respecto.
¿Cuál es la moraleja?
Si comienza a usar encabezados de CSP para ajustar las cosas, sea consciente de los encabezados que necesita para conveniencias como Sizzling Reload en Desarrollo versus cualquier cosa que pueda necesitar en Producción.
¡Espero que esto te ayude a ahorrar algo de tiempo!
Patrocinador: En Rocket Mortgage®, el trabajo que realiza aquí tendrá un 100 % de impacto, pero no ocupará todo su tiempo libre, lo que le brindará el equilibrio perfecto entre el trabajo y la vida private. O como lo llamamos, ¡equilibrio entre tecnología y vida! Aprende más.
Acerca de Scott
Scott Hanselman es un ex profesor, ex arquitecto jefe en finanzas, ahora orador, consultor, padre, diabético y empleado de Microsoft. Es un comediante fracasado, un trenzador de maíz y un autor de libros.