36

当您最初设置 IIS Express 以启用 SSL 时,它默认端口为 44300。不幸的是,当我尝试访问我的站点时,https://localhost/它不起作用,除非我使用端口号 44300 - https://localhost:44300/

链接是使用以下内容生成的:

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

提前谢谢了。

更新:

Divya 在 IIS 论坛上已经回答了这个问题。

4

5 回答 5

28

Divya 在 IIS 论坛上已经回答了这个问题。

在 WebMatrix 中为网站启用 SSL 后,它默认为端口 44300 并在后台执行所有绑定。我希望您尝试在配置文件中将此端口更改为 443。完成并保存后,您还需要修改 http.sys 中的绑定。您需要删除端口 44300 的现有条目并添加端口 443 的条目。为此,您可以使用 httpcfg (WinXp/Win2003) 或“netsh http” (WinVista/Win2K8/Win7)。以下是 netsh 的命令:

1)获取现有条目 44300 的 appid 和 certash(我假设,您将使用 WebMatrix 默认安装的相同证书。如果您也想更改证书,请从证书存储)netsh http show sslcert:。在输出中搜索端口 44300 的条目并复制 certhash 和 appID。

2) 删除 44300 的条目:netsh http delete sslcert ipport=0.0.0.0:44300

3) 为端口 443 添加一个新条目,其中包含在步骤 1 中复制的 certash 和 appID。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
于 2010-09-15T14:21:47.807 回答
4

由于我在这个话题上花了很多时间,我想分享我的发现。我正在从我的其他帖子中重新发布片段减去代码。一些背景和解释:

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

经过反复研究,我能够使用 IIS Express 和重写 Controller 类的OnAuthorization方法(Ref#1)来解决这个问题。我也选择了 Hanselman 推荐的路线(Ref#2)。但是,由于两个原因,我对这两种解决方案并不完全满意:

  1. Ref#1OnAuthorization仅适用于操作级别,不适用于控制器类级别
  2. Ref#2 需要大量设置(Win7 SDK for makecert)、netsh命令,并且为了使用端口 80 和端口 443,我需要以管理员身份启动 VS2010,我对此不以为然。

所以,我想出了这个解决方案,它在以下条件下非常简单:

  1. 我希望能够RequireHttps在 Controller 类或操作级别使用该属性

  2. 我希望 MVC 在属性存在时使用 HTTPS,如果RequireHttps属性不存在则使用 HTTP

  3. 我不想以管理员身份运行 Visual Studio

  4. 我希望能够使用 IIS Express 分配的任何 HTTP 和 HTTPS 端口

  5. 我可以重用 IIS Express 的自签名 SSL 证书,我不在乎我是否看到无效的 SSL Prompt

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

您可以在此处找到我的解决方案/代码 ==> ASP.NET MVC RequireHttps 仅用于生产

于 2012-08-28T19:58:09.940 回答
3

端口 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。

于 2012-08-03T17:53:18.977 回答
0

Dan 的回答是正确的,但是如果您在配置 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”复选框)。本教程指导我如何创建证书并修复它。

于 2015-03-18T12:51:59.710 回答
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);
            }           
        }
    }

在您的网络配置中添加类似这样的内容

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

然后你像这样使用它

    [RequireSSL]            
    public class AdminController : Controller
    {
              ...
    }
于 2016-08-26T12:49:18.497 回答