如何使用来实现 ASP 安全性的数据库和 ASP 会话

文章翻译 文章翻译
文章编号: 299987 - 查看本文应用于的产品
注意
我们强烈建议所有用户都升级到 Microsoft Internet Information Services (IIS) 6.0 版 Microsoft Windows Server 2003 上运行。IIS 6.0 大大提高了 Web 基础结构安全。有关 IIS 的详细信息与安全相关的主题,请访问下面的 Microsoft 网站:
http://www.microsoft.com/technet/security/prodtech/IIS.mspx
展开全部 | 关闭全部

本文内容

概要

本分步指南介绍讨论如何实现基于窗体的活动服务器页面 (ASP) 应用程序的安全性。当您的应用程序安全性得到增强,或当您希望允许只有已通过身份验证的用户时,您可以使用此机制。当用户不是这样与 Internet 用户您内部域的一部分时,您还可以使用此机制。此示例使用一个数据库来存储用户的信息,然后验证对此数据库用户。

系统必备组件

  • Microsoft Windows NT 4.0 工作站、 Windows NT 4.0 服务器、 Microsoft Windows 2000 专业版、 Windows 2000 Server、 Windows 2000 高级服务器,或 Windows Server 2003
  • Microsoft Internet 信息服务器 (IIS) 4.0 对于运行 Windows NT 4.0 的计算机、 Microsoft Internet Information Services (IIS) 5.0 的计算机正在运行 Windows 2000 或 Microsoft Internet Information Services (IIS) 6.0 为运行 Windows Server 2003 的计算机
  • Microsoft SQL Server 6.5 或更高版本的 SQL Server

如何设计此应用程序

本部分简要概述了在您的 ASP Web 应用程序上实现基于窗体的安全或自定义的安全所需的步骤:
  1. 向用户呈现登录窗体。
  2. 验证用户凭据与存储在用户数据库中的用户信息。
  3. 创建一个会话变量,并将其值设置为用户 id。
  4. 对于每个用户进行的后续请求,确认此会话变量的值不等于空字符串 ("") 以确认该用户已经登录。
  5. 空变量时,用户不是有效的用户或者从会话注销用户。将用户重定向到登录页如果该变量为空。
  6. 如果登录失败,因为您的数据库中不存在用户,用户注册可能不在您的站点还。将用户重定向到 Register.asp 页,以便用户可以在您的站点进行注册。当用户注册时, 这些用户的详细信息将添加到用户数据库中。
  7. 除登录页以外的所有页上提供页注销链接,以便用户可以从会话中注销。此页清除会话变量持有用户 ID 通过将它分配为空字符串 ("")。

创建用户的数据库表

  1. 单击 开始、 单击 运行、 在 打开 框中键入 记事本,然后按 ENTER 以启动记事本。
  2. 突出显示以下 SQL 脚本,用鼠标右键单击该脚本,然后单击 复制。在记事本,中单击 粘贴编辑 菜单。
    CREATE TABLE [Users] (
    	[uid] [varchar] (25) NOT NULL ,
    	[password] [varchar] (25) NOT NULL ,
    	CONSTRAINT [PK_Users] PRIMARY KEY  CLUSTERED 
    	(
    		[uid]
    	)  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    					
  3. 文件 菜单上单击 保存。在 文件名 框中键入 User.txt
  4. 单击 开始,指向 程序、 指向 Microsoft SQL Server,然后单击 查询分析器连接到 SQL Server 对话框中指定 SQL Server、 用户 ID 和密码连接到 SQL Server 正在运行的服务器的名称。
  5. 文件 菜单上单击 打开。在 打开 对话框中单击 所有文件 (* *)文件类型 框中。单击在列表中的 User.txt,然后单击 打开
  6. 在工具栏上,数据库 框中选择您要在其中创建此表的数据库。如果您没有为此目的的特定数据库,单击 Pubs 示例 Pubs 数据库中创建该表。
  7. 选择数据库后,单击在以运行查询 查询 菜单上的 执行。此步骤将创建所选数据库中的用户表。

创建和配置虚拟目录

  1. 在 Windows 资源管理器中,创建在 Web 根下的文件夹。默认状态下,Web 根目录是 SystemDrive: \Inetpub\Wwwroot。名称文件夹 ASPSecureAPP。
  2. 打开 Internet 服务管理器 Microsoft 管理控制台 (MMC)。

    注意在 Windows NT 4.0 中此 MMC 被命名为 Internet 服务管理器。
    • 要打开 Internet 服务管理器运行 Windows 2000 或 Windows Server 2003 的计算机上,单击 开始、 单击 运行、 在 打开 框中键入 inetmgr,然后按 ENTER 键。
    • 若要打开在运行 Windows NT 4.0 的计算机上的 Internet 服务管理器,请按照下列步骤操作:
      1. 单击 开始,指向 程序、 指向 Windows NT 4.0 选项包,然后单击 Microsoft Internet 信息服务器
      2. 单击 Internet 服务管理器
  3. 展开 计算机,然后再展开 默认网站。用鼠标右键单击您在步骤 1 中, 创建 ASPSecureAPP 文件夹,然后单击 属性
  4. 属性 对话框 目录 选项卡上单击 创建应用程序设置 部分中标记为应用程序目录。

创建示例页面

注意如果您使用记事本创建这些页,请确保在保存文件时单击 另存为 对话框中的 保存类型 框中的 所有文件
Logon.asp
此页允许用户键入其用户名和密码访问您的站点。

将下面的代码复制到新的 ASP 页中。将文件另存为 Logon.asp ASPSecureAPP Inetpub\Wwwroot 目录的文件夹中。
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
%>
<html><body>
<form action="Validate.asp" method="post">
<P>
Login ID:&#xa0;&#xa0;  <INPUT type=text id=UID  name=UID> <br>
Password:&#xa0;&#xa0;<input type="password" id="passwd" name="passwd"> 
</P>
<input type="submit" value="Logon" id="submit1" name="submit1">
</form>
</body></html>
				
Validate.asp
用户提供了他或她在登录到您的应用程序的登录信息后,此页将验证用户信息,然后将用户重定向到合适的页面。

将下面的代码复制到新的 ASP 页。更改连接字符串参数,以便它们包含有效的值。连接字符串参数如下所示:
  • 用户 ID
  • 密码
  • 初始目录
  • 数据源
将文件另存为 Validate.asp ASPSecureAPP Inetpub\Wwwroot 目录的文件夹中。
<%
Response.Buffer=true

'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

Dim userid
Dim Pwd
'Assign the user ID to this variable. The user provides the user ID.
userid= Request.Form("UID")
'Check whether userid is an empty string. If it is empty, redirect to Logon.asp.
'If it is not empty, connect to the database, and validate the user.

if userid <> "" then
    pwd = Request.Form("passwd")
	
    Dim Cn
    Dim Rs
    Dim StrConnect

'Specify the connection string to access the database.
'Remember to change the following connection string parameters to reflect the correct values
'for your SQL server.
    StrConnect = "Provider=SQLOLEDB.1;User ID=<username>;Password=<strong password>;Initial Catalog=pubs;" & _
    "Network Library=dbmssocn;Data Source=servername"

    Set Cn = Server.CreateObject("ADODB.Connection")
    Cn.Open StrConnect
    Set Rs = Server.CreateObject("ADODB.Recordset")
    Rs.Open "Select * from Users where uid='" & userid & "'",Cn
'Check to see whether this user ID exists in your database.
    If Not Rs.EOF then
        If strcomp( pwd, Rs.Fields("password").value , 1) = 0 then
'Password is correct. Set a session variable, and redirect the user to a Default.asp page
'or the main page in your application.
            Session("UID") = userid
            Response.Redirect "Default.asp"
            Response.End
        Else
'Password is incorrect. Redirect the user to the logon page.
            Response.Redirect "Logon.asp"
            Response.End
        End if
    Else
'If the user is not in your database, point him or her to the Register.asp page
'so that he or she can register at your Web site to access your application.
        Response.Redirect "Register.asp"
        Response.End
    End if
Else
    Response.Redirect "Logon.asp"
    Response.End
End if

%>
				
Register.asp
此页允许注册他们的用户 ID 和密码访问您的站点的用户。

将下面的代码复制到新的 ASP 页。更改连接字符串参数,以便它们包含有效的值。连接字符串参数如下所示:
  • 用户 ID
  • 密码
  • 初始目录
  • 数据源
将文件另存为 Register.asp ASPSecureAPP Inetpub\Wwwroot 目录的文件夹中。
<%
Response.Buffer=true

'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

'Check whether user has submitted user name and password so that you can 
'add that user to the users database and register him or her as a valid 
'user to use this application.
'This is just the minimal code that you need. You can customize this the way you want.
Dim pwd
Dim userid

userid = Request.Form("uname")
pwd = Request.Form("pwd")

If userid <> "" then
    If  pwd <> "" then
        Dim Cn
        Dim Rs
        Dim StrConnect

'Specify the connection string to access the database.
'Remember to change the following connection string parameters to reflect the correct values
'for your SQL server.
        StrConnect = "Provider=SQLOLEDB.1;User ID=<username>;Password=<strong password>;" & _
        "Initial Catalog=pubs;Network Library=dbmssocn;Data Source=servername"

        Set Cn = Server.CreateObject("ADODB.Connection")
        Cn.Open StrConnect
        Set Rs = Server.CreateObject("ADODB.Recordset")
        Rs.Open "Select * from Users where uid='" & userid & "'",Cn,3
        If Rs.RecordCount>0 then
            Response.Write "The Username that you entered has already been taken by someone else."
            Response.Write "Use a different Username."
            Set Rs = Nothing
            Set Cn = Nothing
        Else
            Dim records
            Cn.Execute "INSERT INTO USERS1 (uid,password) VALUES" & _
            "('" & userid & "','" & pwd & "')" , records
            If records=1 then
                Response.Write "You have been registered successfully."
                Set Rs = Nothing
                Set Cn = Nothing
                Session("UID")= userid
                Response.Redirect "Default.asp"
                Response.End 			
            Else
                Response.Write Err.Description
                Set Rs = Nothing
                Set Cn = Nothing
                Response.End 			
            End if
        End if
    Else
    Response.Write "Password is empty. Could not register. Try again."
    End if
End if
%>

<html>
<head>
<script language="javascript">
function callsubmit()
{

if (frm1.pwd.value==frm1.pwdc.value) {
frm1.submit();
}
else
{
alert("Password does not match. Re-enter the password");
}

}
</script>
</head>
<body>
<form action="" method="post" id=frm1 name=frm1>
<P>
Login ID:&#xa0;&#xa0;  <INPUT type=text id=uname  name=uname> <br>
Password:&#xa0;&#xa0;<input type="password" id="pwd" name="pwd"> <br>
Confirm Password:&#xa0;&#xa0;<input type="password" id="pwdc" name="pwdc"> 
</P>
<input type="button" value="Register" id="submit1" name="submit1" onclick=javascript:callsubmit();>
</form>
</body>
</html>
				
Logoff.asp
此页允许注销的用户。

将下面的代码复制到新的 ASP 页中。将文件另存为 Logoff.asp ASPSecureAPP Inetpub\Wwwroot 目录的文件夹中。
<%
Response.Buffer=True

'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

'Set the session variable to an empty string and also destroy the session to make
'to complete the user session.
Session("UID")=""
Session.Abandon
Response.Redirect "Logon.asp"
Response.End
%>
				
Default.asp
使用此页可以测试您所创建的其他页面。

将下面的代码复制到新的 ASP 页中。将文件另存为 Default.asp ASPSecureAPP Inetpub\Wwwroot 目录的文件夹中。
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

if session("UID")="" then 
    Response.Redirect "Logon.asp"
    Response.End
else
    Response.Write "You are logged on as " & session("UID") & "<br>"
end if
%>
<HTML>
<BODY>
<A HREF="Logoff.asp">Click here to log off</A>
<BODY>
</HTML>
				

向页面添加验证代码

下面的代码检查用户是否已登录到您的 Web 站点并不注销还。

将下面的代码块复制到每个安全增强型 ASP 页面 Logon.asp 页和 Validate.asp 页除外。Logon.asp 页或 Validate.asp 页,请不要添加此代码。请确保粘贴此代码在每个页面的顶部,以使此代码显示第一个。
<%
'The following three lines of code are used to make sure that this page is not cached on the client.
Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

if session("UID")="" then 
    Response.Redirect "Logon.asp"
    Response.End
end if
%>
				

此应用程序的工作原理

实质上是,此应用程序的任何人都可以查看而无需提供其凭据的两个页面 (Logon.asp 和 Register.asp)。若要访问页的其余部分的用户必须登录通过使用一个有效的用户 ID 和密码。因此,当用户直接浏览到需要的登录信息的任何页面时, 用户被重定向到 Logon.asp 页。用户必须提供有效的用户 ID 和密码 Logon.asp 页中。是否不正确密码,用户可以尝试再次登录。

如果您的数据库中不存在用户的用户 ID 和密码,用户将被重定向到 Register.asp 页用户可以注册为使用您的应用程序的位置。在用户数据库所用来验证用户输入的用户的详细信息在您的 Web 站点,通过该 Register.asp 用户寄存器页时。

故障排除

  • 根据要求和 $ 安全程度此应用程序是,您可以启用安全套接字层 (SSL) 加密,以避免传输用户凭据以明文形式的 Logon.asp 上。
  • 这些用户帐户并不映射到 Windows 帐户。因此,不能直接使用您的 Windows 帐户,登录到此应用程序。
  • 此安全机制使用基于 ASP 会话的信息。因此,此机制对于不具有启用的 cookie 的用户无法正常工作。

参考

有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
172138如何在 Internet Information Services (IIS) 中创建虚拟目录
282060用于保护 Internet Information Services 资源
299970如何使用 NTFS 权限来保护 IIS 4.0 或 5.0 上运行的 Web 页

属性

文章编号: 299987 - 最后修改: 2006年6月16日 - 修订: 4.2
这篇文章中的信息适用于:
  • Microsoft Active Server Pages 4.0
关键字:?
kbmt kbaspobj kbdatabase kbhowtomaster kbsecurity KB299987 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 299987
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com