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 ====================
#region Override to reroute to non-SSL port if controller action does not have RequireHttps attribute to save on CPU
// By L. Keng, 2012/08/27
// Note that this code works with RequireHttps at the controller class or action level.
// Credit: Various stackoverflow.com posts and http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
protected override void OnAuthorization(AuthorizationContext filterContext)
{
// if the controller class or the action has RequireHttps attribute
var requireHttps = (filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0
|| filterContext.ActionDescriptor.GetCustomAttributes(typeof(RequireHttpsAttribute), true).Count() > 0);
if (Request.IsSecureConnection)
{
// If request has a secure connection but we don't need SSL, and we are not on a child action
if (!requireHttps && !filterContext.IsChildAction)
{
var uriBuilder = new UriBuilder(Request.Url)
{
Scheme = "http",
Port = int.Parse(getConfig("HttpPort", "80")) // grab from config; default to port 80
};
filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
}
}
else
{
// If request does not have a secure connection but we need SSL, and we are not on a child action
if (requireHttps && !filterContext.IsChildAction)
{
var uriBuilder = new UriBuilder(Request.Url)
{
Scheme = "https",
Port = int.Parse(getConfig("HttpsPort", "443")) // grab from config; default to port 443
};
filterContext.Result = this.Redirect(uriBuilder.Uri.AbsoluteUri);
}
}
base.OnAuthorization(filterContext);
}
#endregion
// a useful helper function to get appSettings value; allow caller to specify a default value if one cannot be found
internal static string getConfig(string name, string defaultValue = null)
{
var val = System.Configuration.ConfigurationManager.AppSettings[name];
return (val == null ? defaultValue : val);
}
============== 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).
<appSettings>
<add key="HttpPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
<add key="HttpsPort" value="" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>