Redirection vers HTTPS
Qu'est-ce que le recommander moyen de redirection vers HTTPS toutes les demandes entrantes qui ne sont pas sécurisés. Dois-je écrire un composant middleware? Si oui, je ne pouvais pas comprendre comment obtenir le nom du serveur.
public class RedirectHttpMiddleware
{
RequestDelegate _next;
public RedirectHttpMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.IsSecure)
await _next(context);
else
{
var server = ""; //How do I get the server name?
context.Response.Redirect("https://" + server + context.Request.Path);
}
}
}
- Pour info: il y a une nouvelle UseHttpsRedirection middleware en 2.1 qui fait cela. github.com/aspnet/BasicMiddleware/blob/dev/samples/...
- Il y a un réponse par @Yanga qui montre comment utiliser
UseHttpsRedirection
- cette approche est recommandée depuis .NET de Base 2.1.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser votre propre middleware de classe, mais en général, je viens de faire quelque chose comme cela dans ma configuration de Démarrage:
Qu'il suffit de saisir l'URL en entier, chaîne de requête et de tous, et l'utilisation
GetComponents
pour tout sauf le régime dans l'URL. Puis le HTTPS schéma obtient ajouté les composants de l'URL.Cela va fonctionner avec le plein .NET Framework, pour ASP.NET de Base, vous pouvez faire quelque chose comme ceci:
Ceci ajoute l'hôte et le chemin vers le HTTPS régime. Vous pouvez ajouter d'autres composants tels que la requête et de hachage, trop.
http://localhost:5900
deviendraithttps://localhost:5900
quand il doit êtrehttps://localhost:44300
. Un moyen d'éviter de coder en dur le numéro de port?config.json
peut être le chemin à parcourir alors; ma seule préoccupation, c'est ce qui arrive quand vous avez plusieurs développeurs connecté à la source de contrôle et tous les dev peuvent avoir un port différent dans l'utilisation. Tout particulier de la direction que je dois aller voir si Visual Studio a une sorte de fonction qui peut aider à faciliter le processus (par exemple, l'insertion du port dans les propriétés du projet dansconfig.json
au débogage en temps)?$"https://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}"
IsSecure
n'est pas reconnu danscontext.Request.IsSecure
. Je suis à l'aide d'ASP.NET 5 RC 1IsHttps
.X-Forwarded-Proto
en-tête de la place de laIsHttps
de la propriété.Pour .NET Core 2.0 et inférieure (officiel docs pour la 2.0):
Utiliser le
[RequireHttps]
attribut/filtre.Vous pouvez soit le faire à votre contrôleurs:
Ou encore ajouter ceci dans votre
Startup.cs
dans leConfigureServices
méthode:Aussi, je voulais juste ajouter que vcsjones réponse est également correct, mais vous devez être soin d'ajouter ce code au début de votre config, avant toute autre Middleware/code qui provoque des redirections. Dans mon cas, je l'ai ajouté juste avant j'ai ajouté de l'Identité, Cadre middleware.
services.UseStaticFiles()
avant MVC (comme vous devriez, contenu statique ne doit pas passer à travers le MVC pipeline), puis la redirection ne se produira pas.UseHttpsRedirection
dans .NET de Base 2.1 et au-dessus.La réponse est dans le numéro 1, mais ne s'arrêtent pas là la configuration HTTPS, passer à la deuxième étape:
1 - Nous utilisons ensuite la
RequireHttpsAttribute
de redirection vers HTTPS et définissez le port SSL dans le MVC options. Nous sommes aussi la lecture de la SSL port de launchSettings.json, mais nous avons seulement besoin de ce mode de Développement.2 - Utilisation
AddAntiforgery
pour exiger HTTPS sur votre anti-faux jetons.3 - Utiliser le
NWebsec.AspNetCore.Middleware
package NuGet etUseHsts
méthode pour activer Strict de la Sécurité des Transports (HSTS) à travers le site. N'oubliez pas d'ajouter de la Précharge ci-dessous et soumettre votre site à la HSTS Précontrainte site. Plus d'informations ici et ici.4 - Utilisation
NWebsec.AspNetCore.Middleware
package NuGet et laUseHpkp
méthode de permettre au Public Key Pinning (HPKP) à travers le site. Notez que si vous faites une erreur avec ce que vous êtes essentiellement à DoS avec votre site. Plus d'informations ici et ici.5 - Inclure le https régime dans toute l'URL est utilisée. Content Security Policy (CSP) En-tête HTTP et Sous-ressource de l'Intégrité (SRI) ne jouent pas agréable quand vous imit le régime dans certains navigateurs. Il est préférable d'être explicite sur HTTPS. par exemple,
6 - Utiliser le ASP.NET MVC Réutilisable modèle de projet Visual Studio pour générer un projet avec tout cela, et beaucoup plus construit en. Vous pouvez également consulter le code sur GitHub.
Après tout ce qui précède, votre
Startup
classe devrait ressembler à quelque chose comme ceci:Si vous voulez prendre le port quand, dans un environnement DEV dans .NET Core, regardez
env.IsDevelopment()
, et à condition saisir le port SSL à partirlaunchSettings.json
.`
Après grabing le port SSL, vous pouvez intégrer le port dans la solution posté par @vcsjones.
AlwaysHttpsMiddleware.cs, inspiré par RequiresHttpsAttribute.
De démarrage.cs
J'ai un peu modifié @vcsjones réponse à utiliser le port personnalisé en environnement de dev. Également des crédits à @long2know.
Ce doit apparaître avant l'application.UseStaticFiles ou de l'application.UseMvc, sinon elle sera ignorée.
Noter que le port doit être pris à partir de
launchSettings.json
fichier de sorte que vous devez également ajouter ce fichier àConfigurationBuilder
dans leStartup.cs
:.AddJsonFile(@"Properties/launchSettings.json", optional: false, reloadOnChange: true)
Dans ASP.NET de Base 2.1 utiliser seulement ceci:
Il y a quelques grandes réponses ici, mais j'ai besoin d'une solution qui pourrait fonctionner avec ou sans IIS et aussi de ne pas modifier le protocole lors des locales de débogage. J'ai ajouté ceci juste après l'ajout d'ANNONCES auth pour le pipeline dans le Démarrage.Configurer la méthode. C'est pour le plein cadre. D'autres solutions ici décrivent la manière de reconstruire l'URL de Base.
Afin d'avoir votre DOTNet application de Base pour s'exécuter sous HTTPS, il y a trois étapes à suivre:
Modifier votre Démarrage.cs fichier. Entrez le code suivant:
Droit de la souris sur le Répertoire Racine du Projet, à partir de l'Explorateur de solutions et Sélectionnez Propriétés. Cochez la case Activer SSL, Copie de la liaison SSL et l'ajouter à l'Application de l'URL de la zone.
Une technique abordée à https://github.com/aspnet/KestrelHttpServer/issues/916 est en ajoutant ceci à votre site web.config:
web.config
fichiers. Il n'y a aucune mention de IIS dans la question.J'aime attribut avec la directive du compilateur