2010-09-11 24 views
33

Quando si imposta IIS Express inizialmente per abilitare SSL, la porta viene impostata automaticamente su 44300. Sfortunatamente, quando provo ad accedere al mio sito su https://localhost/, non funziona a meno Io uso il numero di porta 44300 - https://localhost:44300/.IIS Express per impostazione predefinita alla porta 44300 per https quando si abilita SSL

I collegamenti sono generati utilizzando il seguente:

<%= Html.ActionLink("Index", "Index", "Home", new { @action = "https://" + Request.Hostname + Url.Action("Index", "Home") }) %> 

Anche se una soluzione brutta, la parola chiave @action può ignorare il percorso generato, ma significa che l'applicazione avrebbe apparentemente bisogno di essere a conoscenza di qualsiasi non standard porte (es. 44300).

Il problema è che scriverei qualcosa per risolvere un problema che si verificherebbe solo in un ambiente di sviluppo.

Quindi la mia domanda è ... Come posso cambiare la porta in 443 e avere IIS Express simile?

Config per il mio sito è qui sotto:

<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> 

Molte grazie in anticipo.

Aggiornamento:

Questa domanda è stata answered da Divya corso sui forum di IIS.

risposta

25

Questa domanda è stata answered da Divya sui forum di IIS.

Dopo aver abilitato SSL per un sito Web in WebMatrix, per impostazione predefinita porta 44300 e fa tutti i binding in background. Spero che tu abbia provato a cambiare questa porta in 443 nel file di configurazione. Una volta fatto e salvato, è necessario modificare anche il binding in http.sys. È necessario eliminare la voce esistente per la porta 44300 e aggiungere la voce per la porta 443. Per fare ciò, è possibile utilizzare httpcfg (WinXp/Win2003) o 'netsh http' (WinVista/Win2K8/Win7). Qui ci sono i comandi per netsh:

1) Ottenere l'AppID e CertHash per la voce esistente di 44300 (I presumo, che si sta per utilizzare lo stesso certificato che WebMatrix installato per impostazione predefinita Se si desidera modificare. anche il certificato, ottiene l'hash del certificato dal certificato store): netsh http show sslcert. Nella ricerca dell'output per la voce porta 44300 e copia certhash e appID.

2) Cancellare la voce per 44300: netsh http delete sslcert ipport=0.0.0.0:44300

3) Aggiungere una nuova voce per la porta 443 con CertHash e appID copiato nel passaggio 1. netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid>

Dopo aver configurato l'entrata in HTTP.SYS, è necessario riavviare il servizio http affinché le modifiche abbiano effetto.

net stop http

net start http

Come già sottolineato da altri, ci sono molti buoni modi di ottenere i vostri certificati SSL.

netsh http show sslcert > output.txt 

o (il mio metodo preferito):

netsh http show sslcert | clip 
+1

sulla mia macchina Win7, 'netsh spettacolo http sslcert' restituito oltre 100 voci e 44300 era in cima. quindi usa i comandi 'netsh http show sslcert | more' o 'netsh http show sslcert> output.txt' per semplificare le cose su di te. – rymo

+2

@rymo Come approccio collaterale, è possibile utilizzare 'netsh http show sslcert ipport = 0.0.0.0: 44300' che filtra fino a quello specifico. – Alpha

+1

o un'altra soluzione: 'netsh http show sslcert | clip' per copiare il risultato negli appunti, quindi incollarlo nel tuo editor di testo e cercare lì –

2

Il 44300 porto è sequenziale: 00 significa che la sua prima applicazione è stato configurato come abilitato SSL; 01 sarà il secondo e così via.

Dal momento che anche il mio sito Web funziona solo in HTTPS aggiungendo l'attributo globale [RequireHttps], ho avuto alcuni problemi di debug. Una volta lanciato, è stato automaticamente reindirizza a https://localhost/

Per risolvere questo problema durante il debug di un sito web, ho semplicemente creare un nuovo RequireHttpsAttribute che specificare la porta

#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 

Utilizzare questa classe durante il debug solo. Quando viene distribuito su IIS7, è necessario utilizzare la riscrittura Url per reindirizzare a HTTPS.

+0

È proprio questo che volevo evitare - avere il codice che cerca di gestire questa situazione. Alla fine, mi sono spostato su Windows 7 e IIS 7, rimuovendo in modo efficace il mio bisogno di questo trucco. –

+2

Certo, quando si esegue la distribuzione, si fa affidamento sul metodo provato e affidabile già fornito da IIS, ma quando si esegue il debug, è utile. –

+0

Assolutamente.Aggiungerei eventualmente delle regioni di debug nel codice per evitare il rilascio del codice di non-produzione. –

0

Poiché ho trascorso molto tempo su questo argomento, vorrei condividere la mia scoperta. Sto ripubblicando il segmento dal mio altro post meno il codice. Qualche sfondo e spiegazione:

==================================== =

Dopo una ricerca aroud, sono stato in grado di risolvere questo problema con IIS Express e un override del metodo OnAuthorization della classe Controller (Ref # 1). Ho anche seguito il percorso consigliato da Hanselman (Rif. 2). Tuttavia, non era completa soddisfatto di queste due soluzioni a causa di due motivi:

  1. Ref # 1 di OnAuthorization funziona solo a livello di azione, non a livello di classe controller
  2. Rif # 2 richiede un sacco di messa a punto (Win7 SDK per makecert), comandi netsh e, per poter utilizzare la porta 80 e la porta 443, ho bisogno di lanciare VS2010 come amministratore, il che non mi sembra corretto.

Quindi, mi si avvicinò con questa soluzione che è abbastanza semplicistico con le seguenti condizioni:

  1. voglio essere in grado di utilizzare l'attributo RequireHttps al controller livello di classe o l'azione

  2. Voglio MVC per utilizzare HTTPS quando è presente l'attributo RequireHttps e utilizzare HTTP se è assente

  3. Non voglio dover eseguire Visual Studio come amministratore

  4. voglio essere in grado di utilizzare qualsiasi porte HTTP e HTTPS che vengono assegnati da IIS espresso

  5. posso riutilizzare il self-signed cert SSL di IIS Express, e non mi interessa se vedo l'SSL non validi Prompt

==================================== =====

È possibile trovare la mia soluzione/codice qui ==>ASP.NET MVC RequireHttps in Production Only

+0

La risposta generale è praticamente la stessa di quella di Pierre-Alain Vigeant, che divide il codice di sviluppo dal codice di produzione. –

0

Dan risposta è giusta, ma se avete ancora problemi con la configurazione di IIS Express per servire il vostro sito web con HTTP e HTTPS su porte standard qui è bel tutorial che che guiderà passo per passo:

http://www.lansweeper.com/kb/54/How-to-configure-SSL-in-IIS-Express.html

In Nel mio caso ho cancellato accidentalmente il certificato IIS Express. Penso che sia generato la prima volta che usi SSL in Visual Studio (F4 sul progetto selezionato per ottenere la finestra delle proprietà e il checkbox "SSS abilitato"). Questo tutorial mi ha guidato su come creare un certificato e correggerlo.

0

Crea 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); 
      }   
     } 
    } 

E dentro il vostro web di configurazione aggiungere qualcosa di simile

<appSettings>  
    <add key="localhostSSLPort" value="44300"/> 
    </appSettings> 

E poi lo si utilizza come

[RequireSSL]    
    public class AdminController : Controller 
    { 
       ... 
    }