当您最初设置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论坛上提出了answered这个问题。
答案 0 :(得分:28)
Divya在IIS论坛上提出了answered这个问题。
在WebMatrix中为网站启用SSL后,默认为端口44300并在后台执行所有绑定。我希望您尝试在配置文件中将此端口更改为443。完成并保存后,您还需要修改http.sys中的绑定。您需要删除端口44300的现有条目,并添加端口443的条目。 为此,您可以使用httpcfg(WinXp / Win2003)或“netsh http”(WinVista / Win2K8 / Win7)。 以下是netsh的命令:
1)获取44300的现有条目的appid和certhash(我 假设,您将使用与WebMatrix相同的证书 默认安装。如果你想更改证书, 从证书中获取证书的证书哈希值 商店):
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 :(得分:3)
由于我花了很多时间在这个主题上,我想分享我的发现。我正在从我的其他帖子中删除段代码。一些背景和解释:
==========================================
在研究了aroud之后,我能够用IIS Express解决这个问题并覆盖Controller类的OnAuthorization
方法(Ref#1)。我也选择了Hanselman推荐的路线(参考文献#2)。但是,由于两个原因,我对这两种解决方案并不完全满意:
OnAuthorization
仅适用于操作级别,而不适用于控制器级别makecert
),netsh
命令,并且为了使用端口80和端口443,我需要以管理员身份启动VS2010,我皱眉头。所以,我提出了这个解决方案,在以下条件下非常简单:
我希望能够在Controller类或操作级别使用RequireHttps
属性
我希望MVC在RequireHttps
属性存在时使用HTTPS,如果不存在则使用HTTP
我不想以管理员身份运行Visual Studio
我希望能够使用IIS Express分配的任何HTTP和HTTPS端口
我可以重复使用IIS Express的自签名SSL证书,我不在乎我是否看到无效的SSL提示
=========================================
你可以在这里找到我的解决方案/代码==&gt; ASP.NET MVC RequireHttps in Production Only
答案 2 :(得分: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。
答案 3 :(得分: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”复选框)。本教程指导我如何创建证书并修复它。
答案 4 :(得分: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
{
...
}