在ASP.NET中切换HTTP和HTTPS的IHTTP模块

在ASP.NET中切换HTTP和HTTPS的IHTTP模块,asp.net,ssl,Asp.net,Ssl,我正在一个网站上工作,其中包含需要通过SSL保护的部分 我对站点进行了配置,使其在始终使用SSL时运行良好,我在IE7/IE8/FireFox/Safari/Chrome中看到了SSL挂锁 为了实现SSL交换,我创建了一个类来实现IHTTPModule并连接HTTPApplication.PreRequestHandlerExecute 我通过一些自定义逻辑来确定我的请求是否应该使用SSL,然后重定向。我必须处理两种情况: 当前在SSL中,请求不需要SSL 当前不在SSL中,但请求需要SSL

我正在一个网站上工作,其中包含需要通过SSL保护的部分

我对站点进行了配置,使其在始终使用SSL时运行良好,我在IE7/IE8/FireFox/Safari/Chrome中看到了SSL挂锁

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

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

  • 当前在SSL中,请求不需要SSL
  • 当前不在SSL中,但请求需要SSL
最后我做了以下工作(其中ctx是HttpContext.Current,pathAndQuery是ctx.Request.Url.pathAndQuery)

现在来回切换工作正常。然而,当我进入SSL模式时,FireFox和IE8警告我,我的请求没有完全加密


看起来我的模块在某种程度上短路了我的请求,如果您有任何想法,我将不胜感激

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

由于您总是对此类内容丢弃SSL,因此可能会出现页面的一部分(主html)需要SSL的情况,但对该页面上的图像的相应请求却不需要SSL

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

我将检查请求是否是HTML,然后在需要时才删除SSL。否则,请保持原样(最有可能的是图像,而不是完整的url,它们是通过相对路径引用的)

即,如果您有:

<html>
<body>
   Some content...
   <img src="images/someimage.jpg">
</body>
</html>
只需了解如何确定isHtmlContent(如果您不是从数据库等提供图像,而是从磁盘位置提供图像),只需检查资源文件名(.aspx、.asmx、.ashx、.html等)的名称


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

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

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


我强烈建议您使用此(免费/开源)组件来完成您的尝试:


我向您强烈推荐此产品:


它是专业的,易于使用。它附带了一个功能强大的配置工具,只需单击一下即可为您完成整个配置。

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

对于普通用户来说,当Firefox模糊地告诉他们的唯一事情是,“您正在查看的页面的某些部分在通过互联网传输之前未加密。”这与“出错”引擎指示灯一样有用,事实上,这是在他们的信息传输后告诉他们的

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


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

IE8和FF给您的确切警告是什么?FireFox告诉我,我的连接部分加密,“您正在查看的部分页面在通过internet传输之前未加密”有趣的是,Fiddler只显示HTTPS requestsChris,这里唯一的问题是,这是一个CMS,内容作者可以在其中创建站点并设置“RequireSSL”属性。这些站点存储在CMS数据库中,但不存储在IIS中。
<html>
<body>
   Some content...
   <img src="images/someimage.jpg">
</body>
</html>
// SSL not required but current connection is SSL
if (!requestRequiresSSL && ctx.Request.IsSecureConnection && !isHtmlContent)
   ctx.Response.Redirect("http://www.myurl.com" + pathAndQuery);