2010-09-11 431 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 
    { 
       ... 
    }