2010-09-11 432 views
33

當您最初設置IIS Express以啓用SSL時,它默認端口爲44300.不幸的是,當我嘗試訪問我的站點時,它不起作用,除非我使用端口號44300 - https://localhost:44300/啓用SSL時,IIS Express默認端口44300用於https

的鏈路使用生成以下:

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

雖然難看的解決方案,@action關鍵字可以覆蓋所生成的路線,但它意味着,應用程序將看似需要知道任何非標準的端口(例如44300)。

問題在於我會寫一些東西來解決只會在開發環境中出現的問題。

所以我的問題是...我如何將端口更改爲443,並有IIS Express?

配置爲我的網站低於:

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

提前非常感謝。

更新:

這個問題已經通過迪夫亞已經answered在對IIS論壇。

回答

25

這個問題已經由在DivX上的IIS論壇的answered

爲WebMatrix中的網站啓用SSL後,它默認爲端口44300,並在後臺執行所有綁定。我希望你在配置文件中試圖將這個端口改爲443。一旦完成並保存,您還需要修改http.sys中的綁定。您需要刪除端口44300的現有條目,並添加端口443的條目。 爲此,您可以使用httpcfg(WinXp/Win2003)或'netsh http'(WinVista/Win2K8/Win7)。 下面是的Netsh命令:

1)獲取的44300(我 假設,你要使用的WebMatrix的 默認安裝相同的證書。如果你想改變現有的條目的appid和CERTHASH。證書以及 從證書 商店獲得證書的證書哈希):netsh http show sslcert。在輸入搜索條目 端口44300並複製certhash和appID。

2)刪除爲44300的條目:netsh http delete sslcert ipport=0.0.0.0:44300

3)添加端口443的新條目與CERTHASH和APPID在步驟複製 1. netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid>

配置在HTTP.SYS的條目後,您需要重新啓動http 服務才能使更改生效。

net stop http

net start http

正如其他人所指出的,有讓你的SSL證書的幾個不錯的方式。

netsh http show sslcert > output.txt 

或(我的優選方法):

netsh http show sslcert | clip 
+1

我的Win7機,'的netsh HTTP顯示上sslcert'返回了超過100個條目,44300位於頂部。所以使用命令'netsh http show sslcert |更多'或'netsh http顯示sslcert> output.txt'使自己更容易。 – rymo 2013-03-28 21:03:21

+2

@rymo作爲一種方法,你可以使用'netsh http show sslcert ipport = 0.0.0.0:44300'來過濾掉那個特定的一個。 – Alpha 2013-09-25 19:33:33

+1

或其他解決方案:'netsh http show sslcert | clip'將結果複製到剪貼板,然後將其粘貼到文本編輯器中並在那裏搜索 – 2015-03-17 16:25:22

2

端口44300是順序:00表示其第一應用已配置爲啓用了SSL; 01將是第二個,等等。

因爲我也加入了[RequireHttps]全局屬性需要我的網站只有HTTPS工作中,我遇到了一些麻煩的調試。當啓動時,它會自動重定向到https://localhost/

要解決這個問題調試網站的時候,我只需要創建一個新的RequireHttpsAttribute,只有在調試時指定端口

#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 

使用這個類。當部署到IIS7,你應該使用URL重寫重定向到HTTPS。

+0

這就是我想要避免的事情 - 有試圖處理這種情況的代碼。最後,我轉移到了Windows 7和IIS 7,有效地消除了我對這種黑客的需求。 – 2012-08-06 10:48:34

+2

當然,在部署時,您依賴IIS已提供的已證實且可信的方法,但在調試時,它很有用。 – 2012-08-07 02:01:44

+0

絕對。我可能會在代碼中添加調試區域,以避免發佈非生產代碼。 – 2012-08-07 09:50:04

0

既然我已經花了很多時間在這個題目,我想和大家分享我的發現。我從我的其他職位中減去代碼重新發布細分。一些背景和解釋:

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

經過研究後,我用IIS Express解決了這個問題,並覆蓋了Controller類的OnAuthorization方法(參考#1)。我也走了與Hanselman的建議路線(參考文獻2#)。不過,我並沒有完全滿足這兩種解決方案有兩個原因:

  1. 參考#1的OnAuthorization只能在行動層面,而不是在控制器類級別
  2. 參考#2需要大量設置的(Win7的SDK爲makecert),netsh命令,爲了使用端口80和443端口,我需要啓動VS2010管理員,我看不慣。

所以,我想出了這個解決方案,符合下列條件相當簡單:

  1. 我希望能夠在控制器類或行動水平使用RequireHttps屬性

  2. 我希望MVC在存在RequireHttps屬性時使用HTTPS,如果不存在則使用HTTP

  3. 我不想運行Visual Studio中以管理員身份

  4. 我希望能夠使用任何HTTP和HTTPS由IIS快遞分配的端口

  5. 我可以重複使用IIS表達的自簽名的SSL證書,我不在乎如果我看到無效的SSL提示

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

您可以在這裏找到我的解決方案/代碼==>ASP.NET MVC RequireHttps in Production Only

+0

一般的答案與Pierre-Alain Vigeant的幾乎相同,它將生產代碼中的開發代碼分開。 – 2012-08-29 08:10:11

0

丹的答案是正確的,但如果你仍然有配置IIS Express來爲你的網站與HTTP和HTTPS在標準端口的問題在這裏是很好的教程,指導您一步一步:

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

在我的情況我不小心刪除了IIS Express證書。我認爲這是第一次在Visual Studio中使用SSL時生成的(在選定項目上的F4以獲取屬性窗口並檢查'SSS Enabled'複選框)。本教程指導我如何創建證書並對其進行修復。

0

創建類

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

和Web配置裏面添加這樣的事情

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

然後你使用它像

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