IHTTPModule在ASP.NET中切换HTTP和HTTPS

时间:2009-03-05 22:17:47

标签: asp.net ssl

我正在开发一个网站,其中包含需要通过SSL保护的部分。

我已经配置了网站,以便在它始终使用SSL时运行正常,我在IE7 / IE8 / FireFox / Safari / Chrome中看到SSL挂锁

为了实现SSL切换,我创建了一个实现IHTTPModule并连接HTTPApplication.PreRequestHandlerExecute的类。

我通过一些自定义逻辑来确定我的请求是否应该使用SSL,然后重定向。我必须处理两种情况:

  • 目前在SSL中,请求不需要SSL
  • 目前不在SSL中,但请求需要SSL

我最终做了followng(其中ctx是HttpContext.Current,pathAndQuery是ctx.Request.Url.PathAndQuery)

// SSL required and current connection is not SSL
if (requestRequiresSSL & !ctx.Request.IsSecureConnection)
   ctx.Response.Redirect("https://www.myurl.com" + pathAndQuery);
// SSL not required but current connection is SSL
if (!requestRequiresSSL & ctx.Request.IsSecureConnection)
   ctx.Response.Redirect("http://www.myurl.com" + pathAndQuery);

来回切换现在可以正常工作。但是,当我进入SSL模式时,FireFox和IE8警告我,我的请求未完全加密。

看起来我的模块以某种方式短路我的请求,会感激任何想法。

6 个答案:

答案 0 :(得分:4)

我怀疑,当你确定哪些资源需要加密,哪些不需要加密时,你不会包含图像,或者包括页眉和页脚,甚至包括CSS文件,如果你使用的话。

由于您总是丢弃此类内容的SSL,因此可能会发生页面的一部分(主html)需要SSL,但此页面上对图像的相应请求却没有。

浏览器警告您,页面的某些部分未使用SSL传送。

我将检查请求是否适用于HTML,然后只在需要时删除SSL。否则,保持它的方式(最有可能的图像和相关路径引用,而不是一个完整的URL)。

即如果你有:

<html>
<body>
   Some content...
   <img src="images/someimage.jpg">
</body>
</html>

并且您使用SSL请求此页面,但您对 requestRequiresSSL 的评估未将图像视为安全资源,它将形成http,而不是https请求,您将看到警告

确保在您请求资源并评估 requestRequiresSSL 时,检查引荐来源以及这是否是图像:

// SSL not required but current connection is SSL
if (!requestRequiresSSL && ctx.Request.IsSecureConnection && !isHtmlContent)
   ctx.Response.Redirect("http://www.myurl.com" + pathAndQuery);

只是弄清楚如何确定isHtmlContent(如果你不从数据库等提供图像,但是从磁盘位置提供),只需检查资源文件名(.aspx,.asmx,.ashx,.html,等)。

这样,如果连接是加密的,但资源本身不是html,并且没有设置“加密”,那么你就不会放弃加密。

答案 1 :(得分:1)

我强烈建议您使用此(免费/开源)组件来执行您正在尝试的操作:

  

http://www.codeproject.com/KB/web-security/WebPageSecurity_v2.aspx

答案 2 :(得分:0)

.Net通常不处理的任何内容(例如常规html和大多数图形文件)都不会执行httpmodule,因为它不会通过.net

最好的办法是在IIS级别处理此问题。有关如何配置服务器的信息,请参阅以下内容。

http://www.jameskovacs.com/blog/HowToAutoRedirectToASSLsecuredSiteInIIS.aspx

答案 3 :(得分:0)

我强烈推荐你这个产品:

http://www.e2xpert.com/web/Http-Https-Switch.aspx

专业且易于使用。它配备了强大的配置工具,只需单击一下即可完成整个配置。

答案 4 :(得分:0)

只需在整个网站,所有网页以及所有图片/脚本/样式表中使用SSL。这只是让一切变得简单。 IE和Firefox将不再抱怨,你将不再有疯狂的模块试图猜测是否应该重定向任何给定的请求等。

答案 5 :(得分:0)

对于普通用户来说,当Firefox模糊地告诉他们“你正在查看的部分页面在通过互联网传输之前没有加密”时,他们几乎不可能做出明智的决定。这与“有些错误”的引擎灯一样有用,实际上是在他们的信息被转移后告诉他们。

此消息应至少附带一个列表,提供URL,内容类型(图像,javascript,css)及其对用户的意义。顺便说一句,我在使用GMail时收到此消息。

在此之前,正如其他人所说,一旦确定了不安全的元素,您的代码就会起作用。然后,您可以使用Firebug(http://getfirebug.com)检查通过连接传递的内容。