Lorsque vous configurez initialement IIS Express pour activer SSL, le port par défaut est 44300. Malheureusement, lorsque j'essaie d'accéder à mon site sur https://localhost/
, il ne fonctionne que si j'utilise le numéro de port 44300 - https://localhost:44300/
.
Les liens sont générés à l'aide des éléments suivants:
<%= Html.ActionLink("Index", "Index", "Home", new { @action = "https://" + Request.Hostname + Url.Action("Index", "Home") }) %>
Bien que la solution soit laide, le mot clé @action
peut remplacer la route générée, mais cela signifie que l’application aurait apparemment besoin de connaître les ports non standard (par exemple, 44300).
Le problème, c'est que j'écrirais quelque chose pour résoudre un problème qui ne se produirait que dans un environnement de développement.
Ma question est donc ... Comment puis-je changer le port en 443 et que IIS Express l’aime?
La configuration pour mon site est ci-dessous:
<site name="MySite" id="2" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="C:\Inetpub\MySite" />
</application>
<bindings>
<binding protocol="http" bindingInformation=":80:" />
<binding protocol="https" bindingInformation=":44300:" />
</bindings>
</site>
Merci d'avance.
Mettre à jour:
Cette question a été répondue par Divya sur les forums IIS.
Cette question a été réponse de Divya sur les forums IIS.
Une fois que vous avez activé SSL pour un site Web dans WebMatrix, le port par défaut est 44300 et toutes les liaisons sont effectuées en arrière-plan. J'espère que vous avez essayé de changer ce port en 443 dans le fichier de configuration. Une fois que cela est fait et enregistré, vous devez également modifier la liaison dans http.sys. Vous devez supprimer l'entrée existante pour le port 44300 et ajouter l'entrée pour le port 443 . Pour ce faire, vous pouvez utiliser httpcfg (WinXp/Win2003) ou 'netsh http' (WinVista/Win2K8/Win7) . Voici les commandes pour netsh:
1) Obtenez l'appid et certhash pour l'entrée existante de 44300 (je suppose. Vous supposerez utiliser le même certificat que WebMatrix Installe par défaut. Si vous souhaitez également modifier le certificat, obtenir le hachage du certificat du certificat auprès du certificat store):
netsh http show sslcert
. Dans la sortie, recherchez l'entrée pour port 44300 et copiez certhash et appID.2) Supprimer l'entrée pour 44300:
netsh http delete sslcert ipport=0.0.0.0:44300
3) Ajoutez une nouvelle entrée pour le port 443 avec certhash et appID copiés à l'étape 1.
netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid>
Après avoir configuré l'entrée dans http.sys, vous devez redémarrer http service pour que les modifications prennent effet.
net stop http
net start http
Comme l'ont noté d'autres personnes, il existe plusieurs méthodes pratiques pour obtenir vos certificats SSL.
netsh http show sslcert > output.txt
ou (ma méthode préférée):
netsh http show sslcert | clip
Le port 44300 est séquentiel: 00 signifie que c’est la première application que vous avez configurée comme compatible SSL; 01 sera le deuxième et ainsi de suite.
Comme je demande également à mon site Web de ne fonctionner qu'en HTTPS en ajoutant l'attribut global [RequireHttps]
, j'ai eu quelques problèmes de débogage. Au lancement, il était automatiquement redirigé vers https://localhost/
Pour résoudre ce problème lors du débogage d'un site Web , je crée simplement une nouvelle RequireHttpsAttribute
qui spécifie le port
#if DEBUG
public class RequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
base.HandleNonHttpsRequest(filterContext);
var result = (RedirectResult)filterContext.Result;
var uri = new UriBuilder(result.Url);
uri.Port = 44301;
filterContext.Result = new RedirectResult(uri.ToString());
}
}
#endif
Utilisez cette classe uniquement lors du débogage. Une fois déployé sur IIS7, vous devez utiliser la réécriture d’URL pour rediriger vers HTTPS.
Depuis que j'ai passé beaucoup de temps sur ce sujet, je voudrais partager ma conclusion. Je republie le segment de mon autre poste moins le code. Quelques fondements et explications:
=========================================
Après des recherches approfondies, j'ai pu résoudre ce problème avec IIS Express et une substitution de la méthode OnAuthorization
de la classe de contrôleurs (réf. N ° 1). J'ai également suivi l'itinéraire recommandé par Hanselman (réf. N ° 2). Cependant, je n'étais pas complètement satisfait de ces deux solutions pour deux raisons:
OnAuthorization
de la référence 1 ne fonctionne qu'au niveau action, pas au niveau de la classe du contrôleurmakecert
), netsh
et, afin d'utiliser les ports 80 et 443, je dois lancer VS2010 en tant qu'administrateur, ce que je désapprouve.J'ai donc proposé cette solution assez simpliste avec les conditions suivantes:
Je veux pouvoir utiliser l'attribut RequireHttps
au niveau de la classe de contrôleur ou du niveau d'action
Je souhaite 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.
Je peux réutiliser le certificat SSL auto-signé de IIS Express et je ne me soucie pas de voir l'invite SSL non valide.
========================================
Vous pouvez trouver ma solution/code ici ==> ASP.NET MVC RequireHttps en production uniquement
La réponse de Dan est correcte, mais si vous rencontrez toujours des problèmes pour configurer IIS Express afin de desservir votre site Web avec http et https sur des ports standard, voici le didacticiel Nice qui vous guide pas à pas:
http://www.lansweeper.com/kb/54/How-to-configure-SSL-in-IIS-Express.html
Dans mon cas, j'ai accidentellement supprimé le certificat Express IIS. Je pense qu'il est généré la première fois que vous utilisez SSL dans Visual Studio (F4 sur le projet sélectionné pour obtenir la fenêtre des propriétés et cochez la case "SSS activé"). Ce tutoriel m'a guidé comment créer un certificat et le corriger.
Créer une classe
public class RequireSSLAttribute: RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
base.HandleNonHttpsRequest(filterContext);
if (filterContext.HttpContext.Request.Url.Host.ToLower().Equals("localhost"))
{
// redirect to HTTPS version of page
string localhostSSLPort = System.Configuration.ConfigurationManager.AppSettings["localhostSSLPort"];
string url = "https://" + filterContext.HttpContext.Request.Url.Host + ":" + localhostSSLPort + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url);
}
}
}
Et dans votre configuration Web, ajoutez quelque chose comme ça
<appSettings>
<add key="localhostSSLPort" value="44300"/>
</appSettings>
Et puis vous l'utilisez comme
[RequireSSL]
public class AdminController : Controller
{
...
}