データベースと ASP セッションを使用して ASP セキュリティを実装する方法

文書翻訳 文書翻訳
文書番号: 299987 - 対象製品
この記事は、以前は次の ID で公開されていました: JP299987
マイクロソフトでは、Microsoft Windows Server 2003 で実行される Microsoft インターネット インフォメーション サービス (IIS) 6.0 にアップグレードすることを、すべてのユーザーに強く推奨します。IIS 6.0 により、Web インフラストラクチャのセキュリティが大幅に強化されます。IIS のセキュリティ関連のトピックについては、次のマイクロソフト Web サイトを参照してください。
http://www.microsoft.com/japan/technet/security/prodtech/iis.mspx
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Active Server Pages (ASP) アプリケーションのためのフォーム ベースのセキュリティを実装する方法について、手順を追って説明します。このメカニズムは、アプリケーションの高度なセキュリティで保護されているときや、認証されたユーザーにのみアクセスを許可するときに使用できます。また、ユーザーが内部ドメインに属していない場合 (インターネット ユーザーなど) にも使用できます。このサンプルでは、データベースにユーザー情報を保存し、そのデータベースを使用してユーザーの検証を行います。

必要条件

  • Microsoft Windows NT 4.0 Workstation、Windows NT 4.0 Server、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 インターネット インフォメーション サービス (IIS) 5.0、Windows Server 2003 を実行するコンピュータの場合は Microsoft インターネット インフォメーション サービス (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] をポイントして、[クエリ アナライザ] をクリックします。[SQL Server の接続] ダイアログ ボックスで、SQL Server を実行するサーバーの名前、および SQL Server に接続するためのユーザー ID とパスワードを指定します。
  5. [ファイル] メニューの [開く] をクリックします。[ファイルを開く] ダイアログ ボックスで、[ファイルの種類] ボックスの一覧の [すべてのファイル] をクリックします。ファイルの一覧で [User.txt] をクリックし、[開く] をクリックします。
  6. ツール バーのデータベースのドロップダウン リスト ボックスから、このクエリで作成したテーブルを作成するデータベースを選択します。この用途に使用できる適切なデータベースがない場合は、[pubs] をクリックして、pubs サンプル データベース内にテーブルを作成します。
  7. データベースを選択したら、[クエリ] メニューの [実行] をクリックして、クエリを実行します。これで、選択したデータベース内に Users テーブルが作成されます。

仮想ディレクトリの作成と構成

  1. エクスプローラで、Web ルートにフォルダを作成します。デフォルトの Web ルートは SystemDrive:\Inetpub\Wwwroot です。作成したフォルダに ASPSecureAPP という名前を付けます。
  2. インターネット サービス マネージャ Microsoft 管理コンソール (MMC) を開きます。

    : Windows NT 4.0 では、この MMC にインターネット サービス マネージャという名前が付けられています。
    • Windows 2000 または Windows Server 2003 を実行するコンピュータ上でインターネット サービス マネージャを開くには、[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[ファイル名を指定して実行] ダイアログ ボックスに inetmgr と入力し、Enter キーを押します。
    • Windows NT 4.0 を実行しているコンピュータでインターネット サービス マネージャを開くには、次の手順を実行します。
      1. [スタート] ボタンをクリックし、[プログラム]、[Windows NT 4.0 Option Pack] の順にポイントし、[Microsoft Internet Information Server] をクリックします。
      2. [インターネット サービス マネージャ] をクリックします。
  3. [コンピュータ] を展開し、[既定の Web サイト] を展開します。手順 1. で作成した ASPSecureAPP フォルダを右クリックし、[プロパティ] をクリックします。
  4. [プロパティ] ダイアログ ボックスの [ディレクトリ] タブで、[アプリケーションの設定] の [作成] をクリックして、このディレクトリをアプリケーションとしてマークします。

サンプル ページの作成

: これらのページをメモ帳で作成する場合は、ファイルを保存するときに [名前を付けて保存] ダイアログ ボックスで必ず、[ファイルの種類] ボックスの一覧の [すべてのファイル] をクリックしてください。
Logon.asp
ユーザーがこのサイトにアクセスするために、自分のユーザー ID とパスワードを入力するページです。

次のコードを新しい 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>
				

各ページへのユーザー検証コードの追加

次のコードは、ユーザーが既に 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
%>
				

このアプリケーションの動作

このアプリケーションには基本的に、アカウント情報を入力せずにすべてのユーザーが参照できるページが 2 つ (Logon.asp と Register.asp) あります。その他のページを参照するには、ユーザーが自分のユーザー ID とパスワードを入力してログオンする必要があります。したがって、ログオン情報を必要とするいずれかのページをユーザーが直接参照しようとすると、Logon.asp ページにリダイレクトされ、そこでユーザー ID とパスワードを入力しなければなりません。正しくないパスワードを入力した場合は、再びログオンを試みることができます。

ユーザーのユーザー ID とパスワードがデータベースに存在しない場合は、Register.asp ページにリダイレクトされ、そこでアプリケーションに登録することができます。ユーザーが Web サイトの Register.asp ページで登録を行うと、ユーザーの確認に使用されるユーザー データベースにそのユーザーの情報が入力されます。

トラブルシューティング

  • アプリケーションの要件やセキュリティ レベルによっては、SSL (Secure Sockets Layer) 暗号化を使用します。Logon.asp で SSL 暗号化を有効にすると、ユーザーのアカウント情報のクリア テキストでの転送を避けることができます。
  • このユーザー アカウントは、Windows アカウントとは対応付けられません。したがって、このアプリケーションに Windows アカウントを使用して直接、ログオンすることはできません。
  • このセキュリティ メカニズムは、ASP のセッション ベースの情報を使用します。このため、Cookie を有効にしていないユーザーに対しては機能しません。

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
172138 仮想ディレクトリの作成方法
282060 [IIS] IIS のセキュリティ保護に関連するリソース
299970 [HOW TO] NTFS セキュリティを使用して IIS 4.0 または 5.0 上の Web ページを保護する方法

プロパティ

文書番号: 299987 - 最終更新日: 2006年9月5日 - リビジョン: 5.1
この資料は以下の製品について記述したものです。
  • Microsoft Active Server Pages 4.0
キーワード:?
kbaspobj kbdatabase kbhowtomaster kbsecurity KB299987
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

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