Share via


メンバーシップ

作成者: Microsoft

注意

この記事が作成されて以来、ASP.NET メンバーシップ プロバイダーは ASP.NET Identity に置き換えられました。 この記事の執筆時点で取り上げられたメンバーシップ プロバイダーではなく 、ASP.NET ID プラットフォームを使用するようにアプリを更新することを強くお勧めします。 ASP.NET ID には、ASP.NET メンバーシップ システムに比して、次のような多くの利点があります。

  • パフォーマンスの向上
  • 拡張性とテスト性の向上
  • OAuth、OpenID Connect、および 2 要素認証のサポート
  • クレームベースの ID のサポート
  • ASP.Net Core との相互運用性の向上

ASP.NET メンバーシップは、ASP.NET 1.x からのフォーム認証モデルの成功に基づいています。 ASP.NET フォーム認証を使用すると、ログイン フォームを ASP.NET アプリケーションに組み込み、データベースやその他のデータ ストアに対してユーザーを検証する便利な方法が提供されます。

ASP.NET メンバーシップは、ASP.NET 1.x からのフォーム認証モデルの成功に基づいています。 ASP.NET フォーム認証を使用すると、ログイン フォームを ASP.NET アプリケーションに組み込み、データベースやその他のデータ ストアに対してユーザーを検証する便利な方法が提供されます。 FormsAuthentication クラスのメンバーは、認証用の Cookie、有効なログインのチェック、ユーザーのログアウトなどを処理できるようにします。ただし、ASP.NET 1.x アプリケーションでフォーム認証を実装するには、かなりの量のコードが必要になる場合があります。

ASP.NET 2.0 のメンバーシップは、フォーム認証のみを使用する上で大きな進歩です。 (メンバーシップは、フォーム認証と組み合わせて使用する場合に最も堅牢ですが、フォーム認証を使用することは要件ではありません)。すぐにわかるように、ASP.NET Membership とログイン コントロールを ASP.NET 2.0 で使用して、多くのコードをまったく記述せずに強力なメンバーシップ システムを実装できます。

ASP.NET 2.0 でのメンバーシップの実装

メンバーシップは、次の 4 つの手順で実装されます。 多くのサブステップと、実装できるオプションの構成があることに注意してください。 これらの手順は、メンバーシップの構成の全体像を示すために用意されています。

  1. メンバーシップ データベースを作成します (SQL Serverがメンバーシップ ストアとして使用されている場合)。

  2. アプリケーション構成ファイルでメンバーシップ オプションを指定します。 (メンバーシップは既定で有効になっています)。

  3. 使用するメンバーシップ ストアの種類を決定します。 オプションは次のとおりです。

    • Microsoft SQL Server (バージョン 7.0 以降)
    • Active Directory ストア
    • カスタム メンバーシップ プロバイダー
  4. ASP.NET フォーム認証用にアプリケーションを構成します。 もう一度、メンバーシップはフォーム認証を利用するように設計されていますが、フォーム認証を使用することは要件ではありません。

  5. メンバーシップのユーザー アカウントを定義し、必要に応じてロールを構成します。

メンバーシップ データベースの作成

メンバーシップ ストアとして SQL Server 7.0 以降を使用している場合は、aspnet_regsql ユーティリティ (Visual Studio .NET 2005 コマンド プロンプトから最も簡単に使用できます) を使用して、データベースを構成できます。 aspnet_regsql ユーティリティは、コマンド プロンプト ツールとして、または GUI ウィザードを使用して使用できます。 ウィザードの方法は、データベースを構成する最も簡単な方法です。 ウィザードにアクセスするには、次のコマンドを実行します。

aspnet_regsql W

そのコマンドを実行すると、次に示すように、ASP.NET SQL Server セットアップ ウィザードが表示されます。

A S P ドット NET S Q L サーバー セットアップ ウィザードを示すスクリーンショット。

図 1

ASP.NET SQL Server セットアップ ウィザードでは、ウィザードで指定したインスタンスに Web サイトが作成されます。 ただし、ASP.NET では、machine.config ファイル内の接続文字列を使用してデータベースに接続します。 既定では、この接続文字列は SQL Server 2005 インスタンスを指すので、SQL Server 2000 または SQL Server 7.0 インスタンスを使用している場合は、machine.config ファイル内の接続文字列を変更する必要があります。 この接続文字列は、次の場所にあります。

<configuration>
    <connectionStrings>
      <add name="LocalSqlServer"
         connectionString="data source=(local);
         Integrated Security=SSPI;Initial Catalog=aspnetdb;"  
         providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

残念ながら、接続文字列を変更しないと、ASP.NET にわかりやすいエラーは表示されません。 データベースを作成していないという苦情が続きます。 上記の場合、私は自分のローカルSQL Server 2000インスタンスを指すように接続文字列を変更しました。

構成の指定とユーザーとロールの追加

メンバーシップを構成する次の手順では、アプリケーションのweb.config ファイルに必要な情報を追加します。 ASP.NET 1.x では、lowerCamelCase の使用と Intellisense の不足により、web.config ファイルの変更が困難な場合があります。 Visual Studio .NET 2005 では、構成ファイルの Intellisense を使用してタスクをはるかに簡単に行うことができますが、ASP.NET 2.0 は、構成ファイルを編集するための Web インターフェイスを提供することでさらに 1 歩進みます。

Web インターフェイスを起動するには、次に示すように、ソリューション エクスプローラー ツール バーの [ASP.NET 構成] ボタンをクリックします。 ログイン コントロールの挿入時に表示されるポップアップを使用して Web インターフェイスを起動することもできます。

web.configが選択されたソリューション エクスプローラー ツール バーを示すスクリーンショット。

図 2

これにより、次に示す ASP.NET Web サイト管理ツールが起動します。 ASP.NET Web サイト管理は、アプリケーション設定を簡単に管理できる 4 タブのインターフェイスです。 次のタブを使用できます。

  • Home
  • セキュリティ ユーザー、ロール、アクセスを構成します。
  • アプリケーション アプリケーション設定を構成します。
  • プロバイダー アプリケーション メンバーシップ プロバイダーを構成してテストします。

Web サイト管理ツールを使用すると、新しいユーザーの作成、新しいロールの作成、およびユーザーとロールの管理を簡単に行うことができます。 この機能は、Windows インターフェイスでは使用できません。 Windows インターフェイスを使用すると、承認設定を簡単に定義し、Web サイト管理ツールにないプロバイダー機能を追加、削除、管理できます。

Windows インターフェイスを起動するには、インターネット インフォメーション サービス スナップインを開き、アプリケーションを右クリックして、[プロパティ] を選択します。 [ASP.NET] タブをクリックし、[構成の編集] ボタンをクリックします。 ([構成の編集] ボタンを有効にするには、ASP.NET 2.0 でアプリケーションが実行されている必要があります。ASP.NET バージョンは、ASP.NET ダイアログでも構成できます)。[ASP.NET 構成設定] ダイアログが次のように表示されます。

[A S P dot N E T Configuration Settings]\(構成設定\) ダイアログの [全般] タブを示すスクリーンショット。

図 3

[全般] タブに、接続文字列とアプリケーション設定が一覧表示されます。 斜体の設定は親構成ファイル (machine.configまたはより高いレベルのweb.config) で定義され、斜体以外の設定はアプリケーション構成ファイルから取得されます。 アプリケーション レベルで設定が追加、削除、または編集された場合、ASP.NET は、継承元の構成ファイルから設定を削除する代わりに、web.configアプリケーション レベルで設定を追加、削除、または変更します。

[認証] タブを次に示します。 ここでメンバーシップ設定を構成します。 フォーム認証設定、メンバーシップ プロバイダー、およびロール プロバイダーは、ここで構成できます。

[A S P dot N E T Configurations]\(A S P ドット N E T 構成\) ダイアログの [Authentication]\(認証\) タブを示すスクリーンショット。

図 4

アプリケーションでのメンバーシップの実装

アプリケーションに ASP.NET 2.0 メンバーシップを実装する最も簡単な方法は、提供されたログオン コントロールを使用することです。 このメソッドを使用すると、コードをまったく記述せずに、ASP.NET 2.0 メンバーシップの基本を実装できます。

ASP.NET 2.0 では、次のログオン コントロールを使用できます。

ログイン コントロール

Login コントロールは、メンバーシップ システムにログインするユーザーのためのインターフェイスを提供します。 ユーザー名とパスワードのテキストボックスとログインボタンが提供されます。 まだ登録していないユーザーに登録するためのリンク、ユーザーが後続の訪問時に自動的にログインできるようにするチェックボックス、パスワードリマインダーのリンクなど、他の多くの一般的な機能。Login コントロールのすべての機能は、コントロールのプロパティを使用してカスタマイズできます。

ASP.NET 1.x では、開発者はフォーム認証を使用するときにルックアップを実行するためにかなりの量のコードを記述する必要がありました。 ASP.NET 2.0 メンバーシップを使用すると、コードをまったく記述せずにユーザーを検証できます。 ASP.NET は自動的にユーザーの検索を行います。 (ASP.NET メンバーシップを使用せずに Login コントロールを使用している場合は、 OnAuthenticate メソッドを使用してユーザーを検証できます)。

LoginView コントロール

LoginView コントロールは、既定で 2 つのテンプレートを提供するテンプレート化されたコントロールです。AnonymousTemplate と LoggedInTemplate。 表示されるテンプレートは、ユーザーがメンバーシップ システムにログインしているかどうかによって決まります。 通常、このコントロールは、ユーザーがまだログインしていない場合は Login コントロールを表示し、ユーザーがログインしたときに LoginStatus コントロールやその他のログイン コントロールを表示するために使用されます。 ASP.NET アプリケーションでロール管理を使用している場合、LoginView コントロールはユーザー ロールに基づいて特定のテンプレートを表示できます。 (ASP.NET ロール管理の詳細については、後で説明します)。

PasswordRecovery コントロール

PasswordRecovery コントロールを使用すると、ユーザーは現在のパスワードを使用してメールを受信したり、自分のパスワードをリセットしたりできます。 クリア テキストと暗号化されたパスワードは、ユーザーに回復して電子メールで送信できます。 パスワードがハッシュされている場合は、回復できません。 代わりに、ユーザーはパスワードリセットを実行する必要があります。

LoginStatus コントロール

LoginStatus コントロールは、ログインしていないユーザーにログイン インジケーターを表示し、現在ログインしているユーザーにログアウト インジケーターを表示するために使用されます。 Request.IsAuthenticated プロパティは、表示するインジケーターを決定するために使用されます。 LoginStatus コントロールによって表示されるインジケーターは、テキスト ( LoginText プロパティと LogoutText プロパティを使用して実装される) またはイメージ ( LoginImageUrl プロパティと LogoutImageUrl プロパティを使用して実装) です。

ユーザーが LoginStatus コントロールを使用してログアウトすると、 LogoutPageUrl プロパティで指定された URL にリダイレクトされます。 そのプロパティが設定されていない場合は、現在のページが更新されます。 サイトはフォーム認証によって保護されている可能性があるため、現在のページの更新により、ユーザーはサイトのログイン ページにリダイレクトされます。

LoginName コントロール

LoginName コントロールには、サイトに現在ログインしているユーザーのユーザー名が表示されます。

CreateUserWizard コントロール

CreateUserWizard コントロールは、メンバーシップ システムに登録するための便利な方法をユーザーに提供します。 次に示すインターフェイスを使用して、手順 (WizardSteps のコレクションとして実装) を追加できます。

[Create User Wizard Tasks]\(ユーザー ウィザードタスクの作成\) ダイアログを示すスクリーンショット。ドロップダウン メニューが表示され、新しいアカウントにサインアップします。

図 5

CreateUserWizard は、Wizard クラスから派生し、次のテンプレートを提供するテンプレート化されたコントロールです。

  • HeaderTemplate このテンプレートは、ウィザードのヘッダーの外観を制御します。
  • SidebarTemplate このテンプレートは、ウィザードのサイドバーの外観を制御します。
  • StartNavigationTemplate このテンプレートは、開始手順でのウィザードのナビゲーションの外観を制御します。
  • StepNavigationTemplate このテンプレートは、開始ステップまたは終了ステップでない場合のナビゲーション領域の外観を制御します。
  • FinishNavigationTemplate このテンプレートは、完了ステップ時のナビゲーション領域の外観を制御します。

さらに、ウィザードに追加するステップごとに、ASP.NET は、そのステップの ContentTemplate と CustomNavigationTemplate の両方を含むカスタム テンプレートを作成します。 CreateUserWizard のカスタマイズの詳細については、VS.NET 2005 のドキュメントを参照してください。

ChangePassword コントロール

ChangePassword コントロールを使用すると、ユーザーは自分のパスワードを変更できます。 DisplayUserName プロパティが true (既定では false) の場合、ユーザーはログインしていないときに自分のパスワードを変更できます。 ユーザー 既にログインしていて、DisplayUserName プロパティが true の場合、ユーザーはログインしていない別のユーザーのパスワードを、そのユーザーのユーザー ID を知っていれば変更できます。

ユーザーがログインしなくてもパスワードを変更できるようにする場合は、ChangePassword コントロールが表示されているページで匿名アクセスが許可されていることを確認する必要があることに注意してください。 明らかに、ユーザーはパスワードを変更するために古いパスワードを指定する必要があります。

ロール管理

ロール管理を使用すると、特定のロールにユーザーを割り当て、そのロールに基づいて特定のファイルまたはフォルダーへのアクセスを制限できます。 また、ロール管理には API も用意されており、プログラムによって他のユーザーのロールを決定したり、特定のロール内のすべてのユーザーを特定したり、それに応じて応答したりできます。

ロール管理は、ASP.NET メンバーシップの要件ではなく、ロール管理を使用するためのメンバーシップ要件でもありません。 ただし、2 つのサプリメントはお互いにうまく補完し、開発者が互いに組み合わせて使用する可能性があります。

アプリケーションでロール管理を有効にするには、web.config ファイルで次の変更を行います。

<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />

cacheRolesInCookie 属性が true に設定されている場合、ASP.NET はユーザー ロール メンバーシップをクライアントの Cookie にキャッシュします。 これにより、RoleProvider への呼び出しなしでロール参照を実行できます。 この属性を使用する場合、開発者は cookieProtection 属性が All に設定されていることを確認することをお勧めします。 (これは既定の設定です)。これにより、Cookie データが確実に暗号化され、Cookie の内容が変更されていないことを確認できます。 役割は、Web サイト管理ツールを使用して追加できます。 これにより、ロールを簡単に定義し、それらの役割に基づいてサイトの一部へのアクセスを構成し、ユーザーをロールに割り当てることができます。

[ロールの追加] ボタンを含む A S P ドット N E T Web サイト管理ツールを示すスクリーンショット。

図 6

上記のように、ロールの名前を入力し、[ロールの追加] をクリックするだけで、新しいロールを追加できます。 既存のロールの一覧にある適切なリンクをクリックすると、既存のロールを管理または削除できます。

ロールを管理する場合は、次に示すようにユーザーを追加または削除できます。

[ユーザーの検索] ボタンを含む A S P ドット N E T Web サイト管理ツールを示すスクリーンショット。

図 7

[ユーザーがロールに含まれる] チェック ボックスをオンにすると、特定のロールにユーザーを簡単に追加できます。 ASP.NET は、メンバーシップ データベースを適切なエントリで自動的に更新します。 また、アプリケーションのアクセス規則を構成することもできます。 ASP.NET 1.x 開発者は、web.config ファイル内の <authorization> 要素を使用してこれを行うことに慣れていますが、そのオプションは ASP.NET 2.0 で引き続き使用できます。 ただし、次に示すように、Web サイト管理ツールを使用してアクセス規則を管理する方が簡単です。

[ユーザーとロール] の下で項目が選択されている A S P ドット N E T Web サイト管理ツールを示すスクリーンショット。

図 8

この場合、[管理] フォルダーが強調表示され (ツールで淡い灰色で強調表示されるため、見にくい)、管理者ロールにアクセス権が付与されています。 他のすべてのユーザーは拒否されます。 頭のアイコンをクリックしてルールを選択し、[上へ移動] ボタンと [下へ移動] ボタンを使用してルールを配置できます。 ASP.NET <承認> 要素と同様に、ルールは表示される順序で処理されます。 言い換えると、上記のショットのルールの順序が逆の場合、誰も管理フォルダーにアクセスできません。これは、ASP.NET 最初に検出されるルールが、フォルダーに対するすべてのユーザーを拒否するルールであるためです。

ASP.NET 2.0 では、アクセス規則を指定しているフォルダーにweb.config ファイルが追加されます。 アクセス規則は、構成ファイルまたは Web サイト管理ツールを使用して編集できます。 言い換えると、Web サイト管理ツールは、ユーザー フレンドリな環境で構成ファイルを編集できる単なるインターフェイスです。

コードでのロールの使用

ロール管理用 API は、バージョン 1.x 以降変更されていません。 IsInRole メソッドは、ユーザーが特定のロールにあるかどうかを判断するために使用されます。

if (User.IsInRole(Administrators)) {
    btnManageSite.Visible = true;
}

ASP.NET では、現在のコンテキストのメンバーとして RolePrincipal インスタンスも作成されます。 RolePrincipal オブジェクトを使用すると、ユーザーが属するすべてのロールを次のように取得できます。

string[] userRoles = ((RolePrincipal)User).GetRoles();

LoginView コントロールでの RoleGroups の使用

ロールの管理とメンバーシップについて理解したら、ASP.NET 2.0 で LoginView コントロールがこの機能を利用する方法について簡単に説明します。 前に説明したように、LoginView コントロールは、既定で 2 つのテンプレートを含むテンプレート化されたコントロールです。AnonymousTemplate と LoggedInTemplate。 [LoginView タスク] ダイアログには、RoleGroups を編集できるリンク (以下に示します) があります。

ドロップダウンと [役割グループ] が選択された [ログイン ビュー タスク] ダイアログ内の [ログイン ビュー] コントロールを示すスクリーンショット。

図 9

各 RoleGroup オブジェクトには、RoleGroup が適用されるロールを定義する文字列の配列が含まれています。 LoginView コントロールに新しい RoleGroup を追加するには、[ロール グループの編集] リンクをクリックします。 上の図では、管理者用の新しい RoleGroup が追加されていることがわかります。 [ビュー] ドロップダウンからその RoleGroup (RoleGroup[0]) を選択すると、Administrators ロールのメンバーにのみ表示されるテンプレートを構成できます。 次の図では、Sales ロールとディストリビューション ロールのメンバーに適用される新しい RoleGroup を追加しました。 これにより、[LoginView タスク] ダイアログの [ビュー] ドロップダウンに 2 つ目の RoleGroup が追加され、そのテンプレートに追加されたものはすべて、Sales ロールまたは Distribution ロールの任意のユーザーによって表示されます。

[役割グループ コレクション エディター] ダイアログを示すスクリーンショット。ドロップダウンで [管理者] が選択されています。

図 10

既存のメンバーシップ プロバイダーのオーバーライド

メンバーシップの機能を拡張する方法はいくつかあります ASP.NET。 まず、SqlMembershipProvider クラスから継承してそのメソッドをオーバーライドすることで、既存の機能を明らかに変更できます。 たとえば、ユーザーの作成時に独自の機能を実装する場合は、次のように SqlMembershipProvider から継承する独自のクラスを作成できます。

public class jForumMembershipProvider : SqlMembershipProvider {
    public jForumMembershipProvider() {

    }
    public override MembershipUser CreateUser(
    string username,
    string password,
    string email,
    string passwordQuestion,
    string passwordAnswer,
    bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status) {
        // your own implementation
        return base.CreateUser(
        username,
        password,
        email,
        passwordQuestion,
        passwordAnswer,
        isApproved,
        providerUserKey,
        out status);
    }
}

一方、独自のプロバイダーを作成する場合 (たとえば、Access データベースにメンバーシップ情報を格納する場合)、独自のプロバイダーを作成できます。

独自のメンバーシップ プロバイダーの作成

独自のメンバーシップ プロバイダーを作成するには、まず MembershipProvider クラスから継承するクラスを作成する必要があります。 VB.NET を使用している場合、Visual Studio 2005 では、オーバーライドする必要があるすべてのメソッドのスタブが追加されます。 C# を使用している場合は、スタブを追加する必要があります。

次をオーバーライドする必要があります。

  • ApplicationName プロパティ
  • ChangePassword 関数
  • ChangePasswordQuestionAndAnswer 関数
  • CreateUser 関数
  • DeleteUser 関数
  • EnablePasswordReset プロパティ
  • EnablePasswordRetrieval プロパティ
  • FindUsersByEmail 関数
  • FindUsersByName 関数
  • GetAllUsers 関数
  • GetNumberOfUsersOnline 関数
  • GetPassword 関数
  • GetUser 関数
  • GetUserNameByEmail 関数
  • MaxInvalidPasswordAttempts プロパティ
  • MinRequiredNonAlphanumericCharacters プロパティ
  • MinRequiredPasswordLength プロパティ
  • PasswordAttemptWindow プロパティ
  • PasswordFormat プロパティ
  • PasswordStrengthRegularExpression プロパティ
  • RequiresQuestionAndAnswer プロパティ
  • RequiresUniqueEmail プロパティ
  • ResetPassword 関数
  • ユーザー関数のロックを解除する
  • UpdateUser 関数
  • ValidateUser 関数

これは、C# 開発者として実装するためのかなりの一覧です。 実装なしで VB.NET で クラスを作成し、.NET Reflector または同様のツールを使用してコードを C# に変換する方が簡単な場合があります。

接続文字列とその他のプロパティは、Initialize メソッドの既定値に設定する必要があります。 (Initialize メソッドは、プロバイダーが実行時に読み込まれるときに発生します)。Initialize メソッドの 2 番目のパラメーターは System.Collections.Specialized.NameValueCollection 型で、web.config ファイル内のカスタム プロバイダーに関連付けられている add> 要素への<参照です。 このエントリは次のようになります。

<system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="jForumCustomMembershipProvider" >
    <providers>
      <add name="jForumCustomMembershipProvider"
      type="jForumCustomMembershipProvider"
      requiresQuestionAndAnswer="true"
      connectionString="Provider=Microsoft.Jet.
        OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
        App_Data\Members.mdb;Persist Security
        Info=False"
        />
    </providers>
  </membership>
</system.web>

Initialize メソッドの例を次に示します。

public override void Initialize(string name,
    System.Collections.Specialized.NameValueCollection config) {

    if (config["requiresQuestionAndAnswer"])
        _requiresQuestionAndAnswer = true;
    _connString = config["connectionString"];
    base.Initialize(name, config);
}

ユーザーがログイン フォームを送信するときにユーザーを検証するには、ValidateUser メソッドを使用する必要があります。 このメソッドは、ユーザーが Login コントロールのログイン ボタンをクリックしたときに発生します。 このメソッドにユーザー検索を行うコードを配置します。

ご覧のように、独自のメンバーシップ プロバイダーを作成することは困難ではなく、ASP.NET 2.0 のこの強力な機能を拡張できます。