Je souhaite utiliser RequireHttpsAttribute pour empêcher les requêtes HTTP non sécurisées d'être envoyées à une méthode d'action.
C #
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
Malheureusement, ASP.NET Development Server ne prend pas en charge HTTPS.
Comment puis-je faire en sorte que mon application ASP.NET MVC utilise RequireHttps lorsqu'elle est publiée dans l'environnement de production, mais pas lorsqu'elle est exécutée sur mon poste de travail de développement sur le serveur de développement ASP.NET?
asp.net-mvc
visual-studio
ssl
https
Zack Peterson
la source
la source
Réponses:
Cela n'aidera pas si vous exécutez les versions Release sur votre poste de travail de développement, mais la compilation conditionnelle pourrait faire le travail ...
Mettre à jour
Dans Visual Basic, les attributs font techniquement partie de la même ligne que la définition à laquelle ils s'appliquent. Vous ne pouvez pas mettre des instructions de compilation conditionnelle dans une ligne, vous êtes donc obligé d'écrire la déclaration de fonction deux fois - une fois avec l'attribut et une fois sans. Cela fonctionne, cependant, si vous ne vous souciez pas de la laideur.
Mise à jour 2
Plusieurs personnes ont mentionné dériver de
RequireHttpsAttribute
sans donner d'exemple, alors en voici un pour vous. Je pense que cette approche serait beaucoup plus propre que l’approche de compilation conditionnelle, et ce serait ma préférence à votre place.AVERTISSEMENT: je n'ai pas testé ce code, même un peu, et mon VB est assez rouillé. Tout ce que je sais, c'est qu'il compile. Je l'ai écrit sur la base des suggestions de spot, queen3 et Lance Fisher. Si cela ne fonctionne pas, cela devrait au moins transmettre l'idée générale et vous donner un point de départ.
Fondamentalement, le nouvel attribut se ferme au lieu d'exécuter le code d'autorisation SSL par défaut, si la demande actuelle est locale (c'est-à-dire que vous accédez au site via localhost). Vous pouvez l'utiliser comme ceci:
Beaucoup plus propre! À condition que mon code non testé fonctionne réellement.
la source
Si quelqu'un a besoin de la version C #:
la source
filters.Add(new MyRequireHttpsAttribute ());
àFilterConfig
?Dériver de RequireHttps est une bonne approche.
Pour éviter complètement le problème, vous pouvez également utiliser IIS sur votre ordinateur local avec un certificat auto-signé. IIS est plus rapide que le serveur Web intégré et vous avez l'avantage que votre environnement de développement ressemble plus à la production.
Scott Hanselman a une excellente ressource sur quelques façons d'implémenter HTTPS local avec VS2010 et IIS Express.
la source
En exploitant le système de filtre MVC et Global.asax.cs, je suppose que vous pouvez le faire ...
la source
Comme c'est le serveur de développement ASP.Net qui a causé votre problème en premier lieu, il convient de noter que Microsoft a maintenant IIS Express , qui est livré avec Visual Studio (depuis VS2010 SP1). Il s'agit d'une version réduite d'IIS qui est aussi facile à utiliser que le serveur de développement, mais qui prend en charge l'ensemble des fonctionnalités d'IIS 7.5, y compris SSL.
Scott Hanselman a publié un article détaillé sur l'utilisation de SSL dans IIS Express .
la source
Que diriez-vous d'hériter de l'attribut RequireHttps dans un attribut personnalisé. Ensuite, dans votre attribut personnalisé, vérifiez la propriété IsLocal de la demande actuelle pour voir si la demande provient de l'ordinateur local. Si tel est le cas, n'appliquez pas la fonctionnalité de base. Sinon, appelez l'opération de base.
la source
Cela a fonctionné pour moi, MVC 6 (ASP.NET Core 1.0) . Le code vérifie si le débogage est en cours de développement, et sinon, SSL n'est pas requis. Toutes les modifications sont dans Startup.cs .
Ajouter:
Ajouter:
Éditer:
la source
Si vous pouvez dériver et remplacer - faites-le. Si vous ne pouvez pas - MVC est livré avec des sources, prenez simplement les sources et créez votre propre attribut [ForceHttps] qui vérifie IsLocal.
la source
Pour MVC 3, j'ai ajouté mon propre FilterProvider (basé sur le code trouvé ici: Filtres globaux et conditionnels qui, entre autres choses (affichage des informations de débogage pour les utilisateurs locaux, etc.) décoreront toutes les actions avec
RequireHttpsAttribute
quandHttpContext.Request.IsLocal == false
.la source
Après avoir fait des recherches, j'ai pu résoudre ce problème avec IIS Express et un remplacement de la méthode OnAuthorization de la classe Controller (Ref # 1). J'ai également suivi l'itinéraire recommandé par Hanselman (Ref # 2). Cependant, je n'étais pas complètement satisfait de ces deux solutions pour deux raisons: 1. L'OnAuthorization de Ref # 1 ne fonctionne qu'au niveau de l'action, pas au niveau de la classe de contrôleur 2. La Ref # 2 nécessite beaucoup de configuration (Win7 SDK pour makecert ), les commandes netsh et, pour utiliser le port 80 et le port 443, je dois lancer VS2010 en tant qu'administrateur, ce que je désapprouve.
Donc, j'ai trouvé cette solution qui met l'accent sur la simplicité avec les conditions suivantes:
Je veux pouvoir utiliser l'attribut RequireHttps au niveau de la classe ou de l'action Controller
Je veux que MVC utilise HTTPS lorsque l'attribut RequireHttps est présent et utilise HTTP s'il est absent
Je ne veux pas avoir à exécuter Visual Studio en tant qu'administrateur
Je souhaite pouvoir utiliser tous les ports HTTP et HTTPS attribués par IIS Express (voir la remarque n ° 1)
Je peux réutiliser le certificat SSL auto-signé d'IIS Express, et je m'en fiche si je vois l'invite SSL non valide
Je veux que le développement, le test et la production aient exactement la même base de code et le même binaire et soient aussi indépendants de la configuration supplémentaire (par exemple, en utilisant netsh, le composant logiciel enfichable mmc cert, etc.) que possible.
Maintenant, avec le contexte et l'explication à l'écart, j'espère que ce code aidera quelqu'un et fera gagner du temps. Fondamentalement, créez une classe BaseController qui hérite de Controller et dérivez vos classes de contrôleur de cette classe de base. Puisque vous avez lu jusqu'ici, je suppose que vous savez comment faire cela. Alors, bon codage!
Note # 1: Ceci est réalisé par l'utilisation d'une fonction utile 'getConfig' (voir le code)
Réf # 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Réf # 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== Code dans BaseController ====================
============== code de fin =================
Dans Web.Release.Config, ajoutez ce qui suit pour effacer HttpPort et HttpsPort (pour utiliser les valeurs par défaut 80 et 443).
la source
Une solution que vous pouvez utiliser aussi bien en production que sur poste de travail de développement. Il est basé sur votre option dans les paramètres de l'application dans web.config
Si vous ne souhaitez pas utiliser SSL, supprimez la clé. Si vous utilisez le port SSL standard 443, supprimez la valeur ou spécifiez 443.
Ensuite, utilisez une implémentation personnalisée de RequireHttpsAttribute qui prend soin de votre condition. Il est en fait dérivé de RequireHttps et utilise la même implémentation de la méthode de base, sauf pour l'ajout de conditions.
N'oubliez pas de décorer la méthode LogOn dans AccountController
et quelque chose comme ça dans votre vue LogOn afin de publier le formulaire sur https.
la source
Comme Joel l'a mentionné, vous pouvez modifier la compilation en utilisant le
#if !DEBUG
directive.Je viens de découvrir que vous pouvez modifier la valeur du symbole DEBUG dans l'élément de compilation de fichier web.config. J'espère que cela pourra aider.
la source
MVC 6 (ASP.NET Core 1.0):
La bonne solution serait d'utiliser env.IsProduction () ou env.IsDevelopment (). En savoir plus sur la raison derrière cette réponse sur la façon d'exiger https uniquement en production .
Réponse condensée ci-dessous (voir le lien ci-dessus pour en savoir plus sur les décisions de conception) pour 2 styles différents:
Startup.cs (filtre de registre):
BaseController.cs (style d'attribut):
RequireHttpsInProductionAttribute : les deux ci-dessus utilisent un attribut personnalisé héritant de RequireHttpsAttribute :
la source
C'était la manière la plus propre pour moi. Dans mon
App_Start\FilterConfig.cs
dossier. Cependant, je ne peux plus exécuter les versions de version.Vous pouvez également le configurer pour qu'il n'exige que https lorsque votre page d'erreur personnalisée est activée.
la source
Veuillez vous référer à cet article de Rick Anderson sur RickAndMSFT sur Azure & MVC Filling the Azure Gap
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
la source