次の方法で共有


ログイン コントロールのセキュリティ保護

更新 : 2007 年 11 月

ASP.NET のログイン コントロールは、ユーザー認証、メンバシップ、およびロールに基づいて、Web ページへのアクセスを制御するためのソリューションを提供できるようにします。ログイン コントロールには、CreateUserWizardLoginLoginStatusLoginViewPasswordRecovery、および ChangePassword の各コントロールが含まれます。このトピックでは、構成およびコーディングの推奨手順を使用して、ログイン コントロールのセキュリティを向上させる方法について説明します。

コーディングと構成の推奨手順に従うことによって、アプリケーションのセキュリティを向上させることができます。ただし、Microsoft Windows とインターネット インフォメーション サービス (IIS: Internet Information Services) の最新のセキュリティ更新プログラム、および Microsoft SQL Server やその他のデータ ソースの更新プログラムを適用することによって、Web サーバー コンピュータを常に最新の状態に保つことも重要です。

安全なコードの記述およびアプリケーションのセキュリティ保護に関する推奨手順の詳細については、『Writing Secure Code』(Michael Howard および David LeBlanc の共著) や「Microsoft Patterns and Practices」(https://www.microsoft.com/resources/practices/default.mspx) で提供されているガイダンスを参照してください。

他の種類のコントロールの特別なセキュリティ対策に関する情報は、以下のトピックでも入手できます。

ログイン コントロールの一般的なセキュリティ対策

ログイン コントロールをセキュリティで保護するには、さまざまな領域での推奨手順に従うことが必要となります。以下に、これらの領域について簡単に説明します (説明には詳細情報へのリンクが含まれています)。

SSL (Secure Sockets Layer) プロトコルの使用

ASP.NET のログイン コントロールは、HTTP を介して情報をプレーンテキストでサーバーに送信します。機密情報を扱うときには、HTTPS プロトコルを SSL (Secure Sockets Layer) 暗号化と共に使用することを強くお勧めします。SSL は、データが改ざんされないように保護し (データ整合性)、ユーザーの ID を保護 (機密性) します。さらに、データの送信元が予測されたクライアントであることを保証します (認証)。詳細については、「暗号化の概要」、および IIS ドキュメントの「Configuring SSL on a Web Server or a Web Site」を参照してください。

ユーザー入力の検証

ユーザー入力は安全ではないと見なしてください。悪意のあるユーザーが、クライアントからアプリケーションに危険な情報を送信する可能性があります。ログイン コントロールでは、入力される情報は多くの場合機密情報であるため、ユーザー入力については特に注意する必要があります。悪意のある入力からアプリケーションを保護する方法の詳細については、「Web アプリケーションのセキュリティに関する基本的な対策」を参照してください。

できる限り検証コントロールを使用して、有効なユーザー名と強力なパスワードをテストします。検証コントロールを使用せずに検証できるユーザー入力もあります。たとえば、CreateUserWizard コントロールは必須の比較検証をサポートします。EmailRegularExpression プロパティおよび PasswordRegularExpression プロパティを使用して正規表現を指定し、電子メール アドレスが指定されたパターンと一致すること、およびパスワードが要件を満たすことをそれぞれ検証することもできます。

ログイン コントロールでユーザー入力を検証するときに、柔軟性を最も高めるには、テンプレートを使用します。可能であれば、コントロールのテンプレートを作成し、各コントロール (通常は TextBox のコントロール) を追加します。さらに、検証コントロールを追加してユーザーの入力を最も狭い許容範囲に制限します。

ms178346.alert_note(ja-jp,VS.90).gifメモ :

検証コントロールを使用するときは、クライアント側の検証を使用するだけでなく、必ずサーバー コードでの検証を実行します。サーバー コードでの検証を使用すると、クライアント スクリプト チェックを無効にしたり変更したりすることにより検証が省略されることを防止できます。

詳細については、「ASP.NET Web ページにおけるユーザー入力の検証」を参照してください。

ビューステートのセキュリティ保護

ログイン コントロールは、ページのビューステートに情報を格納するため、ビューステートをセキュリティで保護することが最善のセキュリティ対策となります。ビューステートのデータは、エンコードされた形式で格納されますが、データを表示して改ざんされる可能性があります。詳細については、「ASP.NET ビューステートの概要」を参照してください。

メンバシップのセキュリティ保護

ASP.NET のメンバシップには、ユーザー資格情報を検証し、格納するための機能が用意されています。CreateUserWizardLoginPasswordRecovery、および ChangePassword の各コントロールでは、ASP.NET メンバシップを使用して、コードをほとんど必要としない、またはコードを一切必要としない完全な認証システムを構築できるようにします。さらに、LoginNameLoginStatus、および LoginView の各コントロールを使用すると、ユーザー メンバシップを処理し、Web サイト内のページへのアクセスを制御するためのソリューションを完成させることができます。詳細については、「メンバシップの概要」および「メンバシップのセキュリティ保護」を参照してください。

ASP.NET に付属のメンバシップ プロバイダには、無効なパスワードまたはパスワードの解答を試行できる最大回数 (MaxInvalidPasswordAttempts プロパティで指定) に関するしきい値が組み込まれています。ASP.NET メンバシップでは、メンバシップ ユーザーがロックアウトされるまでに、無効なパスワードまたはパスワードの解答を最大回数まで試行できる制限時間 (分数) も設定できます。これは PasswordAttemptWindow プロパティで指定します。パスワード試行の既定のしきい値は 5 であり、パスワード試行ウィンドウが表示される既定の時間は 10 分です。既定のプロバイダのしきい値は、アプリケーションの Web.config ファイルの membership セクションに設定したしきい値によってオーバーライドできます。これらのしきい値を設定する場合は、できるだけ小さい値を設定することをお勧めします。また、無効なパスワードの解答試行は追跡されないため、RequiresQuestionAndAnswer プロパティに false を設定しないことをお勧めします。詳細については、「メンバシップ プロバイダ」を参照してください。

電子メールのセキュリティ保護

CreateUserWizardChangePassword、および PasswordRecovery の各コントロールでは、完了したユーザー トランザクションの詳細情報が記載された電子メール メッセージを送信できます。ユーザーに送信するすべての電子メール メッセージには、必要な情報だけを示すようにします。たとえば、電子メールの件名は、意図しない第三者が他の電子メール メッセージと区別できるような容易な件名にしないようにします。電子メールでパスワードを送信することは避けるようお勧めします。確認コードの送信や、トランザクションを完了するためにユーザーに使用してもらう返信用の URL の送信など、パスワード トランザクションを検査する他の方法を検討します。

CreateUserWizardChangePasswordPasswordRecovery の各コントロールの MailDefinition プロパティを指定していない場合、電子メール メッセージは送信されません。電子メール メッセージを送信するようにこれらのコントロールを構成するときには、SMTP 関連のすべてのエラーを受け取るようにメール エラー イベントを処理し、ユーザーに不要な情報を表示しないようにすることをお勧めします。ChangePassword コントロールの場合は、SendMailError を処理し、SendMailErrorEventArgs オブジェクトの Handled プロパティを true に設定します。メール エラー イベントの処理方法を示す例については、SendMailError イベントのトピックを参照してください。簡易メール転送プロトコル (SMTP: Simple Mail Transfer Protocol) サービスのインストールの詳細については、「方法 : IIS 6.0 内で SMTP 仮想サーバーをインストールおよび構成する」を参照してください。

個々のコントロールのセキュリティに関する考慮事項

以降のセクションでは、ログイン コントロールごとにセキュリティの考慮事項を説明します。

CreateUserWizard

CreateUserWizard コントロールは、ユーザーから情報を収集し、ASP.NET メンバシップ システムにそのユーザーのアカウントを作成します。CreateUserWizard コントロールを拡張して、追加情報を受け入れることができます。これは、フィールドを追加するか、CreateUserWizardStepCompleteWizardStep の各手順の前か後に手順を追加することによって行います。ユーザーが CreateUserWizard コントロールのすべての手順を完了せずにアカウントを作成すると、セキュリティ上の問題が発生する可能性があります。ユーザーがカスタム ウィザードの手順を省略しないようにするには、OnNextButtonClick メソッドをオーバーライドしてカスタム認証を実行します。情報を収集した後で、MembershipProvider クラスの CreateUser メソッドを使用して、ユーザーを作成します。

管理タスクを実行している場合に、CreateUserWizard を使用してユーザー アカウントを自動的に作成するには、AutoGeneratePassword プロパティに true を設定し、LoginCreatedUser プロパティに false を設定することをお勧めします。このシナリオでは、DisableCreatedUser プロパティには false を設定することが推奨されます。

Login コントロール

Login コントロールは、ユーザー名テキスト ボックスとパスワード テキスト ボックスが組み込まれた複合コントロールです。このコントロールには、ユーザーが次回そのページにアクセスしたときのために、情報を保存しておくかどうかを指定するチェック ボックスも組み込まれています。RememberMeSet プロパティを使用すると、認証 Cookie がユーザーのブラウザに送信されます。DisplayRememberMe プロパティを使用すると、永続的な Cookie を送信するかどうかをユーザーが制御できるチェック ボックスが表示されます。RememberMeSet を true に設定し、DisplayRememberMe を false に設定することは避けてください。こうすると、ユーザーの知らない間に Cookie が送信されてしまうからです。一般に、ユーザーのコンピュータに Cookie を格納する場合にはリスクが伴います。Cookie はユーザー入力の別の形式であるため、情報の暴露と悪用の対象になります。詳細については、「ASP.NET の Cookie の概要」を参照してください。

最後に、Login コントロールを広範なエンド ユーザーが使用する場合、パブリック コンピュータのユーザーが、セッションのタイムアウト後に破棄される非永続的な Cookie を使用するかどうかを選択できるコントロールをコーディングすることを検討してください。Cookie の作成の詳細については、「方法 : Cookie を記述する」を参照してください。

LoginName コントロール

LoginName コントロールはユーザーのログイン名を表示します。また、アプリケーションで Windows 認証を使用している場合は、ユーザーのドメインとアカウント名を表示します。ユーザー名を表示するか、アカウント情報を表示するかをユーザーが指定できるチェック ボックスを追加することを検討してください。たとえば、パブリック コンピュータのユーザーにとって、機密情報が表示されることは望ましくない場合があります。

LoginView コントロール

LoginView コントロールを使用すると、ログオンしているユーザーとログオンしていないユーザー (匿名ユーザー) に異なる情報を表示できます。AnonymousTemplate テンプレートと LoggedInTemplate テンプレートを指定して表示する内容、および RoleGroups プロパティに関連付けられたテンプレートを指定して表示する内容を検証し、対象外のテンプレートをユーザーが表示できないことを確認します。特に、RoleGroups プロパティ内のコレクションは、テンプレートが定義されている順序で検索されます。最初に一致するロール グループ テンプレートがユーザーに表示されます。ユーザーが複数のロールのメンバである場合、ユーザーのロールのいずれかに一致する最初のロール グループ テンプレートが表示されます。単一のロールに複数のテンプレートが関連付けられている場合は、最初に定義されたテンプレートだけが使用されます。詳細については、「ロール管理について」を参照してください。

PasswordRecovery コントロール

PasswordRecovery コントロールを使用すると、ユーザーは各自のユーザー名に関連付けられた電子メール アドレスに基づいてパスワードを取得できます。PasswordRecovery コントロールを設定するときは、次のガイドラインに従います。

  • 電子メール メッセージの送信時にエラーが発生した場合は、SendMailError イベントを処理して操作を行います。

  • MaxInvalidPasswordAttempts プロパティでパスワードの解答を試行できる最大回数を設定し、PasswordAttemptWindow プロパティで制限時間ウィンドウを設定します。

  • ユーザーの電子メールに送信されるすべての情報を検証します。特に、パスワードの復元の電子メール メッセージにユーザー パスワードが含まれている場合は、メッセージの送信で使用するチャネルのセキュリティを検証します。メッセージの件名に "パスワード" という単語が含まれているなど、機密情報が含まれていることが明白な電子メール メッセージを送信することは避けてください。

ChangePassword コントロール

ChangePassword コントロールを使用すると、ユーザーがパスワードを変更できるようになります。ChangePassword コントロールを設定するときは、次のガイドラインに従います。

  • 電子メールの送信時にエラーが発生した場合は、SendMailError イベントを処理して操作を行います。

  • MaxInvalidPasswordAttempts プロパティでパスワードの解答を試行できる最大回数を設定し、PasswordAttemptWindow プロパティで制限時間ウィンドウを設定します。

  • ユーザーの電子メールに送信されるすべての情報を検証します。特に、電子メールで新規パスワードをユーザーに送信するように ChangePassword コントロールが設定されている場合は、メッセージの送信で使用するチャネルのセキュリティを検証します。

  • SSL を使用して、ポストバック時にユーザーの新しいパスワードを読み取ることができないようにします。

  • ユーザーに送信する電子メール メッセージの本文として ChangePassword コントロールが使用するファイルへのアクセスを制限します。このファイルは、MailDefinition クラスの BodyFileName プロパティで定義されます。

参照

処理手順

方法 : IIS 6.0 内で SMTP 仮想サーバーをインストールおよび構成する

概念

Web アプリケーションのセキュリティに関する基本的な対策

標準コントロールのセキュリティ保護

メンバシップのセキュリティ保護

その他の技術情報

メンバシップを使用したユーザーの管理

ASP.NET Web サイトのセキュリティ

検証サーバー コントロール構文

暗号サービス