我正在寻找使用 IIS7 和 ASP.net 进行安全站点重定向的“最佳实践”方法。假设我有两个域名:
- 我的域名
- 我的域名
每个都有一个 www 子域名。
我有一个使用通用名称的 EV 证书:
- www.mydomain.com
因此,用户可以通过 8 种不同的方式访问该网站:
- http://mydomain.com
- http://mydomain.net
- http://www.mydomain.com
- http://www.mydomain.net
- and also using https://
为了避免用户收到证书错误,必须将用户引导至
- https://www.mydomain.com
使这项工作对用户透明,同时仍确保 IIS 仅提供安全内容的最佳方法是什么?过去,我曾使用 web.config 重定向到这样的子页面:
<system.webServer>
<httpRedirect destination="https://www.mydomain.com/secureSubPage" />
或者使用通配符证书在公共基页中使用此块:
if (!Request.IsSecureConnection)
{
Response.Redirect(Request.Url.ToString().Replace("http:", "https:"), true);
return;
}
if (!Request.Url.ToString().Contains(".com"))
{
Response.Redirect(Request.Url.ToString().Replace(".net", ".com"), true);
return;
}
答案1
要强制所有流量使用 HTTPS,https://www.mydomain.com
您只需使用一条重写规则:
<rules>
<rule name="Force HTTPS" enabled="false" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" negate="true" pattern="^ON$" />
<add input="{HTTP_HOST}" negate="true" pattern="^www\.mydomain\.com$" />
</conditions>
<action type="Redirect" url="https://www.mydomain.com{REQUEST_URI}" appendQueryString="false" redirectType="Permanent" />
</rule>
</rules>
这会将所有非 HTTPS 流量重定向到 ,无论使用哪个域名访问网站https://www.mydomain.com
。它还将重定向https://mydomain.com
到https://www.mydomain.com
。由于当今大多数 SSL 证书都包含带 www 和不带 www 的域名,因此这不会导致浏览器出现错误。
例如,上述重定向规则无法阻止用户使用 访问您的网站https://www.mydomain.net
。这是因为只有在建立 HTTPS 会话后才能检查主机头名称,而在此之前,浏览器会显示错误,因为域名与证书的通用名称不匹配。防止这种情况的唯一方法是为域名使用单独的 IP 地址,mydomain.com
并为您希望您的网站可在其下访问的所有其他域名使用单独的 IP 地址。
为此,您需要设置 DNS 以让(www.)mydomain.net
(以及您希望您的网站可在其上访问的任何其他域名)指向 IP 地址。此 IP 地址已绑定到 IIS 中的仅 HTTP 虚拟站点。此站点的唯一目的是使用以下重写规则X.X.X.1
将所有流量重定向到:https://www.mydomain.com
<rules>
<rule name="Redirect to https://www.mydomain.com" enabled="false" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" negate="true" pattern="^www\.mydomain\.com$" />
</conditions>
<action type="Redirect" url="https://www.mydomain.com{REQUEST_URI}" appendQueryString="false" redirectType="Permanent" />
</rule>
</rules>
然后,您在 IP 地址上为 设置另一个X.X.X.2
使用 HTTP 和 HTTPS 的站点(www.)mydomain.com
。使用上述重写规则(第一个)强制使用 HTTPS 和www.mydomain.com
。
除非使用正确的域名,否则此解决方案将有效地使您的网站无法通过 HTTPS 访问mydomain.com
,但这也是您想要的,因为您没有其他域名的任何有效证书。