例子应用程序:创建密码保护系统
这一节演示如何使用ADO对你的站点进行密码保护。你将学习如何创建一个注册网页,新的访问者可以用它注册到你的站点上。你还将学习如何防止访问者看到他们没有访问权限的网页。
为什么需要一个密码保护系统呢?你可以配置IIS,使用基本认证模式或WINDOWS NT Challenge/Response认证模式。使用两种中的任一种认证系统,通过改变对文件的权限,你可以强制用户在访问一个网页之前输入密码。
注意
要了解使用基本认证模式和WINDOWS NT Challenge/Response认证模式的更多内容,请参阅第20章的“使用权限检查组件”一节。
但是,不论使用基本认证模式或WINDOWS NT Challenge/Response认证模式,都存在一个问题。这两种认证系统都是与WINDOWS NT安全体系想分离的。这意味着每当有新用户注册时,你都要手工添加用户。而且你不能容易地从ASP网页中访问和修改密码和用户名。
如果你只是想通过密码来保护你自己的和其他管理员的特殊网页,IIS提供的两种认证系统都是可行的。但是,假如你想在用户提供了诸如电话号码或信用卡号码这样的信息后,自动为新用户进行注册。在这种情况下,你需要建立一个密码确认系统。
在这一节,你将学习如何使用ADO建立一个密码确认系统。你需要建立如下的数据库表和两个文件:
创建表
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中的各个域没有都填入数据,就显示这个网页。否则,如果所有的域都填入了数据,将发生三件事情:
注册网页只要求用户输入很少的信息。但是,你可以很容易地扩展这个例子,询问用户任何你想知道的信息。例如,你可以要求用户在使用你的站点之前输入一个信用卡号码或地址。要做到这一点,只要在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网页。