整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

http网站转换成https网站

http网站转换成https网站

ttps,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题

一:什么是https

SSL(Security Socket Layer)全称是加密套接字协议层,它位于HTTP协议层和TCP协议层之间,用于建立用户与服务器之间的加密通信,确保所传递信息的安全性,同时SSL安全机制是依靠数字证书来实现的。

SSL基于公用密钥和私人密钥,用户使用公用密钥来加密数据,但解密数据必须使用相应的私人密钥。使用SSL安全机制的通信过程如下:用户与IIS服务器建立连接后,服务器会把数字证书与公用密钥发送给用户,用户端生成会话密钥,并用公共密钥对会话密钥进行加密,然后传递给服务器,服务器端用私人密钥进行解密,这样,用户端和服务器端就建立了一条安全通道,只有SSL允许的用户才能与IIS服务器进行通信。

提示:SSL网站不同于一般的Web站点,它使用的是“HTTPS”协议,而不是普通的“HTTP”协议。因此它的URL(统一资源定位器)格式为“https://网站域名”。

二:https的本地测试环境搭建

1:win7/windows server 2008R2中 IIS7/IIS7.5 搭配https本地测试环境

2:windows server 2003中IIS6.0 搭配https本地测试环境

三:asp.net 结合 https的代码实现

https是由IIS,浏览器来实现的传输层加密,不需要特意的编码。。。平时怎么在asp.net里面编写代码,就怎么写。

很可能要问,为什么我的站点使用了https之后,用firebug之类的软件查看值提交的时候,还是会显示明文呢?例如,博客园的登陆界面提交。

http://passport.cnblogs.com/login.aspx

为什么这里还是能看到明文的用户名和密码呢?

原因是因为:https(ssl)的加密是发生在应用层与传输层之间,所以,在传输层看到的数据才是经过加密的,而我们捕捉到的http post的,是应用层的,是还没经过加密的数据。

  1. 加密的数据只有客户端和服务器端才能得到明文
  2. 客户端到服务端的通信是安全的

支付宝也是https的,但是他的同时也增加了安全控件来保护密码, 以前认为这个只是用来防键盘监听的,其实,看下面http post截获的密码:这个安全控件把给request的密码也先加了密,紧接着https再加次密,果然是和钱打交道的,安全级别高多了:)

四:http网站转换成https网站之后遇到的问题

整站https还是个别的页面采用https?网站的连接是使用相对路径?还是绝对路径?

如果是整站都是https,那么会显得网页有些慢,如果是个别页面采用https,那么如何保证从https转换到http的时候的url的准确性呢?

比如我们用http的时候,网站的头部底部都是用的相对路径,假如你的页面是 http://aa/index.aspx 你跳转到 https://aa/login.aspx 这里怎么来跳转?只能把超链接写死

<a href=”https://aa/login.aspx”>登陆</a> 但是这样的话,你跳转过去之后的页面 ,所有的相对路径都变成了https开头了,这样很影响网站的效率。

虽然使用绝对地址可以解决,但是那样显然不好移植。

下面就是使用第三方的组件,来解决上面的这个问题

http://www.codeproject.com/Articles/7206/Switching-Between-HTTP-and-HTTPS-Automatically-Ver

步骤 先下载dll文件 http://code.google.com/p/securityswitch/downloads/list 我选择的是 SecuritySwitch v4.2.0.0 - Binary.zip这个版本

1: 我们来看看测试项目

admin 文件夹,需要登录之后,才能访问。admin里面的 login.aspx 可以访问。整个admin文件夹都需要https访问

contact.aspx 需要https 访问

default.aspx 和 view.aspx 采用 http 访问

链接我们都采用相对路径,并没有写死成 http://www.xx.com/a.aspx 或者是 https://www.xx.com/a.aspx

下面我们开始用SecuritySwith来实现上面的https和http访问的规则

2:在项目上,添加引用 SecuritySwitch.dll ,并且添加 智能提示

这样,只能提示就有了。

3:然后我们在web.config里面添加设置 。根据IIS的不同,还分为 IIS6+ IIS7.X(经典模式) 以及 IIS7(集成模式) 的不同的配置,这里我们是按照IIS6+IIS7.X的(经典模式)来配置的.

只看看里面的 SSL配置即可

<?xml version="1.0"?>

<configuration>

<!--SSL配置1开始-->

<configSections>

<section name="securitySwitch" type="SecuritySwitch.Configuration.Settings, SecuritySwitch" />

</configSections>

<securitySwitch baseInsecureUri="http://webjoeyssl" baseSecureUri="https://webjoeyssl" xmlns="http://SecuritySwitch-v4.xsd" mode="On">

<!--如果你的http和https仅仅只有一个s的区别,那么这里的base的2个url可以不写,那为什么还要搞这2个url呢?因为比如

你的 baseInsecureUri (基本不安全网址) 是 http://www.qq.com

而你的 baseSecureUri (基本安全网址) 是 https://safe.qq.com

然后这个时候你访问一个需要https的页面,假如是 login.aspx?return=joey

假如你是通过http://www.qq.com/login.aspx?return=joey访问的,那么这个

页面会跳转到http://safe.qq.com/login.aspx?return=joey

-->

<paths>

<add path="~/contact.aspx"/>

<add path="~/admin/login.aspx"/>

<add path="~/admin" />

<!--这里的admin因为不仅是 admin 文件夹,而且还包含类似的 adminNews.aspx adminQQ.aspx 页面"-->

<!--但是如果是 ~/admin/ 就是专门指admin文件夹-->

</paths>

</securitySwitch>

<!--SSL配置1结束—>

<appSettings />

<system.web>

<compilation debug="true">

</compilation>

<!-- 内置票据认证 start-->

<authentication mode="Forms">

<forms name="mycook" loginUrl="admin/login.aspx" protection="All" path="/" />

</authentication>

<!--SSL配置2 如果是 IIS <=6.x, IIS 7.x + 经典模式-->

<httpModules>

<add name="SecuritySwitch" type="SecuritySwitch.SecuritySwitchModule, SecuritySwitch" />

</httpModules>

<!--SSL配置2结束-->

</system.web>

<!--SSL配置2 如果是IIS7.X + 集成模式-->

<!--<system.webServer>

<validation validateIntegratedModeConfiguration="false" />

<modules>

--><!-- for IIS 7.x + 集成模式 --><!--

<add name="SecuritySwitch" type="SecuritySwitch.SecuritySwitchModule, SecuritySwitch" />

</modules>

</system.webServer>-->

<!--如果是IIS7.X+集成模式 SSL配置2 结束—>

</configuration>

4:其他就没有你什么事情了,url的 http 后台 https 的切换,都是securitySwitch 来控制

五:asp.net 内置票据认证+securitySwitch 的实现(就是上面说的 admin 需要登录才能访问)看下文

http://www.cnblogs.com/naniannayue/archive/2012/11/23/2784568.html

六:securitySwitch 4.2 中文帮助文档

http://www.cnblogs.com/naniannayue/archive/2012/11/23/2784653.html

互联网行业更加发达的今天,为避免网站被恶意自动注册,登录,注水,留言等一系列危及网站安全的行为,验证码的作用就更加的重要。下面我们介绍一下在.NET网站中如何制作一个图片类型的验证码以及如何使用验证码进行检查。

1.验证码图片生成

1.1生成4位长度的随机码

1.2创建随机码图片

1.3调用两个方法生成图片实例

2.在html页面引用

当完成上诉操作之后即可在前端的页面上看到一个自动生成的验证码图片;并且验证码进行点击时是会随着点击动作进行变动;且由于将调用的方式放置在了页面当中,故此每一次打开页面都会有一个刷新动作,保证了每次打开页面都会有一个不同的验证码形成。

3.验证码填写是否正确的验证

验证的动作是在后台进行验证的,故此需要唤起一个表单的提交。需要用户将需要填写的信息进行填充,并将看到的验证码填写入对应的验证码文本框;当表单的提交动作触发时就需要我们在后台进行对于验证码是否正确来进行初步的验证;验证码填写正确则将表单提交的内容填充到数据集当中,否则将返回一个验证码填写错误的返回值,阻止下一步的提交动作。

当验证码判断错误以后,进行提示并再次更改验证码

以上就是一个完整的验证码生成以及验证码验证的完整案例,希望对大家有所帮助;或者有更好的方法也请不吝赐教。

asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们,网上有很多文章介绍。“纸上得来终觉浅,绝知此事要躬行”,下面自己总结一下做个笔记。
1、.aspx
Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中创建。
2、.ascx
asp.net的用户控件,是作为一种封装了特定功能和行为(这两者要被用在Web应用程序的各种页面上)的Web页面被开发的。一个用户控件包含了html、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是*.ascx。asp.net里的缺省配置并不允许Web客户端通过url来访问这些文件,但是这个网站的其他页面可以集成这些文件里所包含的功能。
3、.ashx
前面两个都太熟悉了,这个才是要讲的重点。
(1)、使用举例
.ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必须实现IRequiresSessionState接口.
一个简单的实现修改登录用户密码的示例:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.SessionState;
namespace Test
{
    public class HandlerTest : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ClearContent();
            context.Response.ContentType="text/plain";
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //无缓存
            string action=context.Request.Params["action"]; //外部请求
            if (action=="modifyPwd") //用户改密码
            {
                string oldPwd=context.Request.Params["pwd"];
                //在ashx文件用使用Session必须实现IRequiresSessionState接口
                //Session["LogedUser"]是登录用户的会话,用户名和密码都是test
                if (oldPwd.ToUpper() !=((context.Session["LogedUser"]) as Customer).Password.ToUpper()) //用户输入的旧密码和当前登录用户的不相同
                {
                    context.Response.Write("旧密码输入错误!");
                }
                else
                {
                    context.Response.Write("旧密码输入正确!");
                }
            }

            context.Response.End();
        }
        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}


客户端的调用(js和页面部分):


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ASHXTest.aspx.cs" Inherits="ASHXTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>mytest</title>
    <script type="text/javascript">
        function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }
        function createXMLHTTP() {
            var xmlHttp=false;
            var arrSignatures=["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
                         "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
                         "Microsoft.XMLHTTP"];
            for (var i=0; i < arrSignatures.length; i++) {
                try {
                    xmlHttp=new ActiveXObject(arrSignatures[i]);
                    return xmlHttp;
                }
                catch (oError) {
                    xmlHttp=false; //ignore
                }
            }
            // throw new Error("MSXML is not installed on your system."); 
            if (!xmlHttp && typeof XMLHttpRequest !='undefined') {
                xmlHttp=new XMLHttpRequest();
            }
            return xmlHttp;
        }
        var xmlReq=createXMLHTTP();
        // 发送ajax处理请求(这里简单验证旧密码的有效性)
        function validateOldPwd(oTxt) {
            var url="/HandlerTest.ashx?action=modifyPwd&pwd=" + escape(oTxt.value); //.ashx文件
            xmlReq.open("get", url, true);
            xmlReq.setRequestHeader("If-Modified-Since", "0");
            xmlReq.onreadystatechange=callBack;
            xmlReq.send(url); // 发送文本
        }
        function callBack() {
            if (xmlReq.readyState==4) {
                if (xmlReq.status==200) {
                    alert(xmlReq.responseText); // 接收文本
                }
                else if (xmlReq.status==404) {
                    alert("Requested URL is not found.");
                } else if (xmlReq.status==403) {
                    alert("Access denied.");
                } else
                    alert("status is " + xmlReq.status);
            }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="txtOldPwd" type="text" onblur="validateOldPwd(this)" />
    </div>
    </form>
</body>
</html>


分析:
a、以前我们通常都是通过一个简单的aspx文件实现的功能,其实通过ashx也可以。
笔者曾经写过的一篇ajax:数据传输方式简介 ,通过对比,我们发现aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件,其实,在最终编译的时候,aspx和cs还是会编译到同一个类中去.这中间就要设计html的一些逻辑处理;而ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果.比aspx少处理了html的过程(但是ashx也可以处理html的一些逻辑,只是通常都不这么用)。理论上ashx比aspx要快。
b、还是在相同的旧文里,我们知道数据传输的几种方式,其实ashx都可以实现(修改ashx文件里context.Response.ContentType 即可),这里不再赘述了。
(2)、ashx特别适合于生成动态图片,生成动态文本(纯文本,json,xml,javascript等即可)等。
(3)、.ashx文件有个缺点:它处理控件的回发事件非常麻烦。处理数据的回发,通常都需要一些.aspx页的功能,只有自己手动处理这些功能(还不如直接建一个aspx文件来处理)。所以,一般使用.ashx输出一些不需要回发处理的项目即可。
4、总结
aspx-->P(Page)
ascx-->C(Control)
ashx-->H(HttpHandler)

当浏览器访问web服务器,我们最终接收到的还是html文本。浏览器通过渲染引擎解释这些标签,在屏幕上展现出可见的效果。而asp.net不过就是我们应用的一种平台技术来"变相"解释html的,说白了它就是为了提高生产率,它的技术术语再多,本质上还是html范畴内的东西(如果你不通过那些动态页面技术完全利用html和浏览器(当然包括js)技术来实现动态页面效果,那么你会发现效果有了代码量也相当可观).所以说web开发的底层就是一堆的html标签,无论是asp.net还是jsp都是对html某种方式的包装,是html的产物。