如何使用資料庫和 ASP 工作階段來執行 ASP 安全性

文章翻譯 文章翻譯
文章編號: 299987 - 檢視此文章適用的產品。
本文曾發行於 CHT299987
注意事項
Microsoft 強烈建議所有使用者升級至 Windows Server 2003 上所執行的 Microsoft Internet Information Services (IIS) 版本 6.0。IIS 6.0 能大幅提升網頁基礎結構的安全性。如需有關 IIS 安全性主題的詳細資訊,請造訪下列 Microsoft 網站:
http://www.microsoft.com/technet/security/prodtech/IIS.mspx
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步告訴您,如何執行動態伺服器網頁 (ASP) 應用程式的表單安全性。當您的應用程式已增強安全性,或者當您希望只允許已驗證的使用者時,就可以使用這個機制;當使用者不在您的內部網域中 (例如網際網路使用者) 時,您也可以使用這項機制。本範例會以資料庫來儲存使用者的資訊,並接著依據該資料庫來驗證使用者。

先決條件

  • Microsoft Windows NT 4.0 Workstation、Windows NT 4.0 Server、Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server 或 Microsoft Windows Server 2003
  • 執行 Windows NT 4.0 的電腦需要 Microsoft Internet Information Server (IIS) 4.0;執行 Windows 2000 的電腦需要 Microsoft Internet Information Services (IIS) 5.0;執行 Windows Server 2003 的電腦需要 Microsoft Internet Information Services (IIS) 6.0
  • Microsoft SQL Server 6.5 或更新版的 SQL Server

如何設計這個應用程式

本節簡要地列出在 ASP Web 應用程式上實作表單安全性或自訂安全性時的必要步驟:
  1. 向使用者展示登入表單。
  2. 依據您在使用者資料庫中儲存的使用者資訊,來驗證使用者的憑證。
  3. 建立工作階段變數,並將其值設定為使用者 ID。
  4. 其後每次使用者發出要求,就確認這個工作階段變數的值不等於空白字串 (""),以確認該使用者已經登入。
  5. 如果變數是空白的,表示使用者是無效使用者,或是使用者已經登出工作階段。如果變數是空白的,就將使用者重新導向到登入頁面。
  6. 如果是因為資料庫中沒有該使用者而導致登入失敗,就表示該使用者尚未在您的網站註冊。將該使用者重新導向到 Register.asp 頁面,讓該使用者可以在您的網站註冊。使用者在進行註冊時,使用者資料庫就會加入那些使用者詳細資訊。
  7. 在除了登入頁面以外的所有頁面中提供登出頁面的連結,讓使用者可以登出工作階段。這個頁面會為存有使用者 ID 的工作階段變數指派一個空白字串 (""),以清空工作階段變數。

建立使用者資料庫資料表

  1. 按一下 [開始],再按 [執行],在 [開啟] 方塊中輸入 notepad,然後按下 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],再按一下 [Query Analyzer]。在 [連線到 SQL Server] 對話方塊中,指定執行 SQL Server 的伺服器名稱、使用者 ID 和密碼以連線到 SQL Server。
  5. [檔案] 功能表上,按一下 [開啟舊檔]。在 [開啟舊檔] 對話方塊的 [檔案類型] 方塊中,按一下 [所有檔案 (*.*)]。按一下清單中的 User.txt,再按一下 [開啟]
  6. 在工具列的 [DB] 方塊中,選取您要建立資料表的資料庫。如果您還沒有特地為進行這個動作建立特定的資料庫,請按一下 Pubs,以便在 Pubs 範例資料庫中建立這份資料表。
  7. 在選取資料庫之後,按一下 [查詢] 功能表的 [執行],執行這個查詢。這個步驟會在選取的資料庫中建立 Users 資料表。

建立和設定虛擬目錄

  1. 在 Windows Explorer 中,在 Web 根目錄下建立一個資料夾。根據預設,Web 根目錄是 SystemDrive:\Inetpub\Wwwroot。將資料夾命名為 ASPSecureAPP。
  2. 開啟 Internet 服務管理員 Microsoft Management Console (MMC)。

    注意 在 Windows NT 4.0 中,MMC 名為「Internet 服務管理員」。
    • 如果要在執行 Windows 2000 或 Windows Server 2003 的電腦上開啟「Internet 服務管理員」,請按一下 [開始][執行],在 [開啟] 方塊中輸入 inetmgr,然後按 ENTER。
    • 如果要在執行 Windows NT 4.0 的電腦開啟「Internet 服務管理員」,請依照下列步驟執行:
      1. 按一下 [開始],指向 [程式集],再指向 [Windows NT 4.0 Option Pack],接著按一下 [Microsoft Internet Information Server]
      2. 按一下 [Internet 服務管理員]
  3. 展開 [本機],然後展開 [預設網站]。用滑鼠右鍵按一下您在步驟 1 所建立的 [ASPSecureAPP] 資料夾,再按一下 [內容]
  4. [內容] 對話方塊的 [目錄] 索引標籤上,於 [應用程式設定] 區段中按一下 [建立],將該目錄標記成應用程式。

建立範例頁面

注意 如果您使用 [記事本] 來建立這些頁面,那麼當您儲存檔案時,請確定您有在 [另存新檔] 對話方塊的 [存檔類型] 文字方塊中,按一下 [所有檔案]
Logon.asp
這個頁面可以讓使用者輸入使用者名稱和密碼以存取您的網站。

將下列程式碼複製到新的 ASP 頁面中。在 Inetpub\Wwwroot 目錄下的 ASPSecureAPP 資料夾中,將檔案儲存為 Logon.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
%>
<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 頁面中。變更下列連接字串參數,使它們包含有效的值。連接字串參數為:
  • User ID
  • Password
  • Initial Catalog
  • Data Source
在 Inetpub\Wwwroot 目錄下的 ASPSecureAPP 資料夾中,將檔案儲存為 Validate.asp。
<%
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 頁面中。變更下列連接字串參數,使它們包含有效的值。連接字串參數為:
  • User ID
  • Password
  • Initial Catalog
  • Data Source
在 Inetpub\Wwwroot 目錄下的 ASPSecureAPP 資料夾中,將檔案儲存為 Register.asp。
<%
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 頁面中。在 Inetpub\Wwwroot 目錄下的 ASPSecureAPP 資料夾中,將檔案儲存為 Logoff.asp。
<%
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 頁面中。在 Inetpub\Wwwroot 目錄下的 ASPSecureAPP 資料夾中,將檔案儲存為 Default.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
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>
				

在頁面中加入驗證程式碼

下列程式碼會檢查使用者是否已經登入至您的網站,而且尚未登出。

將這段程式碼複製到 Logon.asp 和 Validate.asp 頁面以外的所有安全性增強的 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 頁面,使用者必須在 Logon.asp 頁面中提供有效的使用者 ID 和密碼。如果密碼不正確,使用者可以再次嘗試登入。

如果資料庫中並沒有該使用者的使用者 ID 和密碼,使用者就會被重新導向至 Register.asp 頁面 (使用者可以在其中進行註冊以使用您的應用程式)。當使用者透過 Register.asp 網頁在您的網站中註冊時,該使用者的詳細資訊就會輸入到能用來驗證使用者的使用者資料庫。

疑難排解

  • 您可以根據這個應用程式的需求和安全性層級,在 Logon.asp 網頁中啟用 Secure Sockets Layer (SSL) 加密,避免以純文字格式來傳送使用者憑證。
  • 這些使用者帳戶不會對應到 Windows 帳戶。因此,您無法直接使用您的 Windows 帳戶來登入這個應用程式。
  • 這個「安全性」機制會使用到 ASP 工作階段資訊,所以,如果使用者沒有啟用 Cookies,這個機制將無法運作。

?考

如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
172138 如何建立 IIS 虛擬目錄
282060 Resources for securing Internet Information Services
299970 如何:使用 NTFS 安全保護來保護在 IIS 4.0 或 5.0 上執行的網頁

屬性

文章編號: 299987 - 上次校閱: 2006年9月5日 - 版次: 5.1
這篇文章中的資訊適用於:
  • Microsoft Active Server Pages 4.0
關鍵字:?
kbaspobj kbdatabase kbhowtomaster kbsecurity KB299987
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 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