要解决一个问题,就要发挥刨根问底的精神,把问题彻底解决。这里使用了第三方程序集WebPageSecurity.dll来协助解决SSL的这个问题。下载地址为http://www.codeproject.com/KB/ aspnet/WebPageSecurity/WebPageSecurity_Src.zip。需要注意的是,输入The Code Project网站(http://www.codeproject.com/)的注册账号之后才能下载。
具体的实现步骤如下。
(1)首先将程序集添加到Bin文件夹。编译项目文件包WebPageSecurity,就可以获得WebPageSecurity.dll了。即添加WebPageSecurity.dll到Bin文件夹。
(2)配置Web.Config。在<configSections>节点下加入以下配置:
- <section name=”secureWebPages” type=”Ventaur.
Web.Security.Configuration.SecureWebPageSettings,
WebPageSecurity”/>
在<configuration>节点下加入以下配置:
- 01: <secureWebPages mode=”RemoteOnly”
ignoreHandlers=”WithStandardExtensions”> - 02: <files>
- 03: <add path=”Login.aspx” />
- 04: <add path=”Legal/Privacy.aspx” />
- 05: <add path=”Legal/Copyright.aspx” secure=”Ignore” />
- 06: </files>
- 07: <directories>
- 08: <!–<add path=”/” recurse=”True” />–>
- 09: <add path=”Admin” recurse=”True” />
- 10: <add path=”Admin/Info/” secure=”Insecure” />
- 11: </directories>
- 12: </secureWebPages>
在上面的代码中,第1行加入secureWebPages配置节点。第2行给具体的页面文件使用SSL加密,默认情况是使用SSL。第5行配置不需要SSL加密的页面,secure=”Ignore”表示忽略此页面使用SSL加密。第7行给文件夹下的所有文件使用SSL加密。第10行配置不需要SSL加密的文件夹,secure=”Ignore”表示忽略此文件夹下的所有文件,使用SSL加密。
小知识:Mode值。Mode值主要有以下4种选择情况,分别是On(Default),RemoteOnly,LocalOnly,Off。其中,On(Default)表示来自各个方向的请求使用SSL;RemoteOnly表示来自于远程客户的请求使用SSL网站部署到服务器上;LocalOnly表示在本地调试时使用;Off表示SSL不可用。
(3)添加Module到Application。在<httpModules>节点下加入以下配置:
- <add name=”WebPageSecurity”
- type=”Ventaur.Web.Security.
SecureWebPageModule, WebPageSecurity” />
(4)新建基类BasePage.cs,让所有的ASPX页面继承于BasePage类。
当然,在实际测试过程中,总会遇到这样或那样的麻烦。下面就是测试过程中遇到的一个典型问题。在一台机器上配置好了SSL,由于项目中用到了WebPageSecurity(一个HTTP/HTTPS自动切换的httpmodule),所以在web.config文件中做了相应的设定。弄完后,测试页面,页面没有自动切换。郁闷啊,当时耗费了将近半天时间。
最后检查web.config中的配置发现,把<httpmodules>遗漏了。一查,web.config这个文件里根本没有<httpmodules>的配置,至此,原因终于大白。
通过上述测试,无需在IIS上对每个页面进行配置,SSL加密页面与非SSL页面就可以自动转换了。尤其是对于有大量SSL页面的时候,上面的解决方案可供选择。当我们在网络上轻松游走于各大银行网站的时候,适当想想这些背后的代码方案,还是挺有意思的。原来,安全随时就在我们身边,风景也随时就在我们身边,只是我们的生活太匆忙而忽略了!