例子应用程序：创建密码保护系统

这一节演示如何使用ADO对你的站点进行密码保护。你将学习如何创建一个注册网页，新的访问者可以用它注册到你的站点上。你还将学习如何防止访问者看到他们没有访问权限的网页。

为什么需要一个密码保护系统呢？你可以配置IIS，使用基本认证模式或WINDOWS NT Challenge/Response认证模式。使用两种中的任一种认证系统，通过改变对文件的权限，你可以强制用户在访问一个网页之前输入密码。

注意

要了解使用基本认证模式和WINDOWS NT Challenge/Response认证模式的更多内容，请参阅第20章的“使用权限检查组件”一节。

但是，不论使用基本认证模式或WINDOWS NT Challenge/Response认证模式，都存在一个问题。这两种认证系统都是与WINDOWS NT安全体系想分离的。这意味着每当有新用户注册时，你都要手工添加用户。而且你不能容易地从ASP网页中访问和修改密码和用户名。

如果你只是想通过密码来保护你自己的和其他管理员的特殊网页，IIS提供的两种认证系统都是可行的。但是，假如你想在用户提供了诸如电话号码或信用卡号码这样的信息后，自动为新用户进行注册。在这种情况下，你需要建立一个密码确认系统。

在这一节，你将学习如何使用ADO建立一个密码确认系统。你需要建立如下的数据库表和两个文件：

- 表webusers。用来保存注册信息。

- 注册网页。这个ASP网页包含一个注册表单。通过完成这个表单，一个新用户可以获得对你站点的访问。

- 密码包含文件。每一个需要密码保护的网页都要包含这个文件。

创建表

webusers

表webusers是一个包含三个字段的SQL Sever表。第一个字段保存用户名，第二个字段保存用户密码，第三个字段保存用户的电话号码。

要创建这个表，从Microsoft SQL Sever程序组中启动ISQL/w。然后，在查询窗口中键入以下的文本并执行它：

CRETAT TABLE webusers (UserName VARCHAR(30),

UserPass VARCHAR(30),

UserPhone VARCHAR(30))

无论何时，当一个新访问者试图访问一个密码保护的网页时，将对这个表进行用户名和密码的查询。

创建注册网页

注册网页使新访问者可以注册到你的站点上（见图24.4）。如果某个没有合法密码的访问者试图访问一个密码保护的网页，他（她）将被导向这个注册网页。

图24.4 注册网页

注册网页用了一个选择结构。如果HTML form中的各个域没有都填入数据，就显示这个网页。否则，如果所有的域都填入了数据，将发生三件事情：

- 首先，注册信息被插入到表webusers中。

- 第二，新的用户名和密码被分配给session变量UserName和UserPass。

- 最后，该用户被导向他原来所在的网页（如果原来的网页是未知的，则被导向主页）。

注册网页只要求用户输入很少的信息。但是，你可以很容易地扩展这个例子，询问用户任何你想知道的信息。例如，你可以要求用户在使用你的站点之前输入一个信用卡号码或地址。要做到这一点，只要在HTML form和表webusers中增加一个域即可。表24.4是注册网页的脚本。

注意

如果你在注册表单中要求输入象信用卡号码这样的重要信息，你应该使用加密管道层（SSL）对信息进行加密。要了解加密管道层的更多信息，请参阅第二章，“安装和使用Internet Information Sever”。

表24.4 register.asp

<%CONST HomePage="/default.asp"

' Check If Registration Information Is IncompleteIF Request.Form("UserName")="" OR Request.Form("UserPass")=""[ccc]OR Request.Form("UserPhone")="" THEN%>

<HTML> <HEAD><TITLE>Registration Page</TITLE></HEAD> <BODY BGCOLOR=#FFFFFF> <H2>Please complete all of the following information:</H2> <FORM METHOD="POST" ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>"> <TABLE> <TR> <TD ALIGN=RIGHT>User Name:</TD> <TD><INPUT NAME="UserName" TYPE="TEXT"VALUE="<%=Request.FORM("UserName")%>"></TD> </TR><TR> <TD ALIGN=RIGHT>Password:</TD> <TD><INPUT NAME="UserPass" TYPE="PASSWORD"

VALUE="<%=Request.FORM("UserPass")%>"></TD> </TR><TR> <TD ALIGN=RIGHT>Phone Number:</TD> <TD><INPUT NAME="UserPhone" TYPE="TEXT" VALUE="<%=Request.FORM("UserPhone")%>"></TD> </TR><TR> <TD ALIGN=RIGHT COLSPAN=2> <INPUT TYPE="SUBMIT" VALUE="Continue"> </TD> </TR> </TABLE> </FORM> </BODY> </HTML><%ELSE

' Ready Database Objects Set MyConn=Server.CreateObject("ADODB.Connection") MyConn.Open "FILEDSN=d:\Program Files\Common Files\ODBC\Data Sources\MyData.dsn"

' Insert The Registration Information Into WebUsers MySQL="INSERT WebUsers (UserName,UserPass,UserPhone) VALUES (" MySQL=MySQL&"'"&Request.FORM("UserName")&"'" MySQL=MySQL&",'"&Request.FORM("UserPass")&"'" MySQL=MySQL&",'"&Request.FORM("UserPhone")&"')" MyConn.Execute MySQL MyConn.Close

' Create Session Variables Session("UserName")=Request.FORM("UserName") Session("UserPass")=Request.FORM("UserPass")

' Redirect The User To The Appropriate Page IF Session("GoBack")="" THEN Session("GoBack")=HomePage Response.Redirect Session("GoBack")END IF%>

创建密码包含文件

密码包含文件被包含在你想进行密码保护的每一个网页中。它检查session变量UserName和UserPass是否存在。如果不存在，就要求用户输入名字和密码（见图24.5）。然后到表webusers中查询输入的名字和密码。如果密码是非法的，用户将被重新导向注册网页。表24.5是包含文件的脚本。

图24.5 密码包含文件

表24.5 pass.inc

<%IF Session("UserName")="" OR Session("UserPass")="" THEN IF Request.FORM("UserName")="" OR Request.FORM("UserPass")="" THEN%><HTML><HEAD><TITLE>Enter Password</TITLE></HEAD><BODY><H2>To access this page, you must enter a password: </H2>If you are a new user, click<A HREF="register.asp"> here. </A><FORM METHOD="POST"ACTION="<%=Request.ServerVariables("SCRIPT_NAME")%>"><TABLE><TR><TD ALIGN=RIGHT>NAME</TD><TD><INPUT NAME="UserName" TYPE="TEXT"></TR><TR><TD ALIGN=RIGHT>PASSWORD</TD><TD><INPUT NAME="UserPass" TYPE="PASSWORD"></TD></TR><TR><TD ALIGN=RIGHT COLSPAN=2><INPUT TYPE="SUBMIT" VALUE="Continue"></TD></TR></TABLE></FORM></BODY></HTML><%Response.End ELSE' Ready Database Objects Set MyConn=Server.CreateObject("ADODB.Connection") MyConn.Open "FILEDSN=d:\Program Files\Common[ccc]Files\ODBC\Data Sources\MyData.dsn" ' Check The Password MySQL="SELECT UserName FROM WebUsers WHERE USERNAME='"&Request.FORM("UserName") MySQL=MySQL&"' AND USERPASS='"&Request.FORM("UserPass")&"'" SET RS=MyConn.Execute(MySQL)

' If the password is bad, redirect to the Registration Page IF RS.EOF THEN RS.CLOSE Session("GoBack")=Request.ServerVariables("SCRIPT_NAME") Response.Redirect "register.asp" Response.END END IF RS.CLOSE END IFEND IF%>

测试密码系统

要在你的站点上完成这个密码保护系统，你需要把文件pass.inc包含在每一个要进行密码保护的ASP网页中。（在标准的HTML网页中不能包含这个文件。）表24.6是应该简单的例子。

表24.6 testpass.asp

<!-- #INCLUDE VIRTUAL="pass.inc" --><HTML><HEAD><TITLE> Restricted </TITLE></HEAD><BODY>Only registered users can see this sentence!</BODY></HTML>

这个ASP网页只对已经注册的用户显示。本节中，在测试这个网页时，你可以用Session.Aandon方法删除session变量。session变量UserName和UserPass被删除后，你必须重新输入密码才能访问一个密码保护的网页。

总结

这一章探索了如何使用命令对象执行SQL存储过程。你学习了如何传送和得到输入参数，输出参数，和返回值。本章的第二节提供了使用ADO的两个例子应用程序。你学习了如何创建一个高级反馈网页，如何对站点进行密码保护。

这一章是关于Active Sever Pages对象和组件的最后一章。在本书的下一部分，“使用Microsoft Visual studio”中，你将学习如何使用Visual Studio中的一些程序。这些程序使你能够容易地创建和扩展你的ASP网页。