Si vous êtes enthousiasmé par Rechargement à chaud comme moi ET toi aussi veux une word « A » depuis SecurityHeaders.com (vraiment, essayez ceci maintenant) alors vous apprendrez très rapidement sur Politique de sécurité du contenu en-têtes. Vous devez passer un peu de temps à lire et vous pouvez vous retrouver avec une liste quelque peu sophistiquée de choses autorisées, de scripts, de feuilles de fashion, and so on.
Dans DasBlog Noyau (le moteur de weblog multiplateforme qui exécute ce weblog) Mark Downie les rend configurables et utilise la bibliothèque NWebSpec ASP.NET Middleware pour ajouter les en-têtes nécessaires.
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()
)
);
}
Chacune de ces variables provient d’un fichier de configuration. Oui, ce serait plus sûr s’ils sortaient d’un coffre-fort ou étaient même codés en dur.
DasBlog est une utility assez grande et cool et nous avons remarqué immédiatement après la mise à niveau de Mark vers .NET 6 que nous ne pouvions pas utiliser Sizzling Reload (by way of dotnet watch ou à partir de VS 2022). Nous pouvons nous en plaindre, ou nous pouvons apprendre remark cela fonctionne et pourquoi cela ne fonctionne pas pour nous !
Se memento: Rien dans votre ordinateur ne vous est caché.
En commençant par un easy « Afficher la supply », nous pouvons voir un JavaScript inclus tout en bas qui n’est certainement pas le mien !
<script src="http://feeds.hanselman.com/_framework/aspnetcore-browser-refresh.js"></script>
Okay, cela a du sens automobile nous savons que non seulement HotReload prend en cost C# (code behinds) mais aussi le balisage by way of Razor Pages et le changement de CSS ! Il aurait certainement besoin de communiquer « retour à la maison » au coureur qui est soit « dotnet watch » ou VS2022.
Si je change ASPNETCORE_ENVIRONMENT en « Manufacturing » (soit by way of launch.json, launchsettings ou une variable d’environnement comme celle-ci, je peux voir que le script d’help HotReload supplémentaire n’est pas là :
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
Se memento: Vous ne voulez jamais utiliser dotnet run en manufacturing ! C’est une commande de création de SDK ! Vous voudrez utiliser dotnet exec votre.dll, dotnet votre.dll, ou mieux encore, dans .NET 6, appelez simplement l’EXE directement ! .binDebugnet6.0wshotreloadtest.exe dans mon exemple. Pourquoi? dotnet run supposera toujours qu’il est en développement (vous lui dites littéralement de restaurer, de construire et d’exécuter en une seule commande d’exécution) si vous l’exécutez. Vous remarquerez que l’exécution de l’EXE réel est toujours BEAUCOUP plus rapide également ! N’expédiez pas votre SDK .NET sur votre serveur internet et ne recompilez pas le tout au démarrage en manufacturing !
Nous pouvons voir que aspnnetcore-browser-refresh.js est le côté shopper de Improvement-time HotReload. En regardant notre console de navigateur, nous voyons :
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.
C’est beaucoup à penser. J’ai commencé le middleware de mon utility Internet ASP.NET en disant que c’était OK de parler « à moi-même » mais nulle half ailleurs.
app.UseCsp(choices => choices.DefaultSources(s => s.Self()));
Hm, self semble raisonnable, pourquoi le navigateur ne peut-il pas se reconnecter au serveur Internet Kestrel géré par dotnet? Tout est localhost, non ? Eh bien, spécifiquement, c’est http://localhost pas ws://localhost, ou même wss://localhost (ce s supplémentaire est pour la sécurité) donc je dois autoriser explicitement ws: ou wss: ou les deux, mais uniquement dans Improvement.
Peut-être comme ça (encore une fois, j’utilise NWebSpec, mais ce ne sont que des en-têtes HTTP, vous pouvez donc littéralement les ajouter si vous le souhaitez, codés en dur.)
app.UseCsp(choices => choices.DefaultSources(s => s.Self())
.ConnectSources(s => s.CustomSources("wss://localhost:62895")));
Mais les numéros de port changent, n’est-ce pas ? Faisons juste wss:, uniquement dans Improvement. Maintenant, si j’utilise à la fois des CSP et des WebSockets (ws:, wss:) en manufacturing, je devrai être intentionnel à ce sujet.
C’est quoi la morale ?
Si vous commencez à utiliser les en-têtes CSP pour resserrer les choses, soyez conscient et conscient des en-têtes dont vous avez besoin pour des commodités telles que le rechargement à chaud en développement par rapport à tout ce dont vous pourriez avoir besoin en manufacturing.
J’espère que cela vous aidera à gagner du temps !
Parrainer: Chez Rocket Mortgage®, le travail que vous faites ici aura un affect à 100 % mais ne prendra pas tout votre temps libre, vous offrant un équilibre parfait entre vie professionnelle et vie privée. Ou comme nous l’appelons, l’équilibre approach/vie ! Apprendre encore plus.
À propos de Scott