ASP.NET Web ページ (Razor) サイトへのセキュリティとメンバーシップの追加

Tom FitzMacken

この記事では、ASP.NET Web ページ (Razor) Web サイトをセキュリティで保護して、一部のページをログインしたユーザーのみが使用できるようにする方法について説明します。 (誰でもアクセスできるページを作成する方法も確認できます)。

学習内容:

  • 登録ページとログイン ページを含む Web サイトを作成して、一部のページでメンバーのみにアクセスを制限できるようにする方法。
  • パブリック ページとメンバー専用ページを作成する方法。
  • ロールを定義する方法。これは、サイトで異なるセキュリティアクセス許可を持つグループであり、ユーザーをロールに割り当てる方法です。
  • CAPTCHA を使用して、自動プログラム (ボット) がメンバー アカウントを作成できないようにする方法。

この記事で紹介する ASP.NET 機能を次に示します。

  • WebMatrix スターター サイト テンプレート。
  • WebSecurityヘルパーとRolesクラス。
  • ReCaptchaヘルパー。

チュートリアルで使用するソフトウェアバージョン

  • ASP.NET Web ページ (Razor) 2
  • WebMatrix 3
  • ASP.NET Web ヘルパー ライブラリ

ユーザーが Web サイトにログインできるように、つまり、サイトが メンバーシップをサポートするように Web サイトを設定できます。 これは、さまざまな理由で役立ちます。 たとえば、サイトに、メンバーのみが使用できるページがある場合があります。 場合によっては、フィードバックを送信したりコメントを残したりするために、ユーザーにログインを求める場合があります。

Web サイトがメンバーシップをサポートしている場合でも、ユーザーがサイトの一部のページを使用する前にログインする必要はありません。 ログインしていないユーザーは 匿名ユーザーと呼ばれます。

ユーザーは Web サイトに登録し、サイトにログインできます。 Web サイトには、ユーザー名 (電子メール アドレス) とパスワードが必要です。 ログインしてユーザーの ID を確認するこのプロセスは 、認証と呼ばれます。

セキュリティとメンバーシップは、さまざまな方法で設定できます。

  • WebMatrix を使用している場合は、 スターター サイト テンプレートに基づいて新しいサイトとして簡単に作成できます。 このテンプレートは、セキュリティとメンバーシップ用に既に構成されており、登録ページ、ログイン ページなどが既にあります。

    テンプレートによって作成されたサイトには、Facebook、Google、Twitter などの外部サイトを使用してユーザーがログインできるようにするオプションもあります。

  • 既存のサイトにセキュリティを追加する場合、または スターター サイト テンプレートを使用しない場合は、独自の登録ページ、ログイン ページなどを作成できます。

この記事では、最初のオプション ( スターター サイト テンプレートを使用してセキュリティを追加する方法) に焦点を当てます。 また、独自のセキュリティを実装する方法に関する基本的な情報も提供し、その方法に関する詳細情報へのリンクも提供します。 外部ログインを有効にする方法については、別の記事で詳しく説明します。

スターター サイト テンプレートを使用した Web サイト セキュリティの作成

WebMatrix では、 スターター サイト テンプレートを使用して、次を含む Web サイトを作成できます。

  • メンバーのユーザー名とパスワードを格納するために使用されるデータベース。
  • 匿名 (新規) ユーザーが登録できる登録ページ。
  • ログインとログアウト ページ。
  • パスワードの回復とリセットのページ。

次の手順では、サイトを作成して構成する方法について説明します。

  1. WebMatrix を起動し 、[クイック スタート ] ページで [ テンプレートからサイト] を選択します。

  2. [スタート サイト] テンプレートを選択し、[OK] をクリックします。 WebMatrix によって新しいサイトが作成されます。

  3. 左側のウィンドウで、[ ファイル ] ワークスペース セレクターをクリックします。

  4. Web サイトのルート フォルダーで、 _AppStart.cshtml ファイルを開きます。これは、グローバル設定を格納するために使用される特別なファイルです。 これには、 文字を使用して // コメントアウトされるステートメントがいくつか含まれています。

    //WebMail.SmtpServer = "mailserver.example.com";
    //WebMail.EnableSsl = true;
    //WebMail.UserName = "username@example.com";
    //WebMail.Password = "your-password";
    //WebMail.From = "your-name-here@example.com";
    

    これらのステートメントは、電子メールの WebMail 送信に使用できるヘルパーを構成します。 メンバーシップ システムでは、ユーザーが登録するとき、またはパスワードを変更する場合に、電子メールを使用して確認メッセージを送信できます。 (たとえば、ユーザーが登録した後、登録プロセスを完了するためにクリックできるリンクを含む電子メールを受け取ります)。

    ASP.NET Web ページ サイトへのEmailの追加」の説明に従って、電子メールを送信するには SMTP サーバーへのアクセスが必要です。 電子メール設定を中央の _AppStart.cshtml ファイルに格納して、メールを送信できる各ページに繰り返しコーディングする必要がないようにします。 (登録データベースを設定するために SMTP 設定を構成する必要はありません。SMTP 設定は、ユーザーのメール エイリアスからユーザーを検証し、ユーザーが忘れたパスワードをリセットできるようにする場合にのみ必要です)。

  5. 各ステートメントの前から を削除 // して、ステートメントのコメントを解除します。

    電子メールの確認を設定しない場合は、この手順と次の手順をスキップできます。 SMTP 値が設定されていない場合は、確認メールなしで新しいアカウントをすぐに使用できます。

  6. コードで次の電子メール関連の設定を変更します。

    • アクセス権を持つ SMTP サーバーの名前に設定 WebMail.SmtpServer します。

    • を に設定したままにtrueしておきますWebMail.EnableSsl。 この設定では、SMTP サーバーに送信される資格情報を暗号化してセキュリティで保護します。

    • SMTP サーバー アカウントのユーザー名に設定 WebMail.UserName します。

    • SMTP サーバー アカウントのパスワードに設定 WebMail.Password します。

    • 自分のメール アドレスに設定 WebMail.From します。 これは、メッセージの送信先の電子メール アドレスです。

      Note

      ヒントこれらのプロパティの値の詳細については、「ASP.NET Web ページのSite-Wide動作のカスタマイズ」の「Email設定の構成」を参照してください。

  7. _AppStart.cshtml を保存して閉じます。

  8. ブラウザーで Default.cshtml ページを実行します。

    security-membership-2

    Note

    プロパティが のインスタンスExtendedMembershipProviderである必要があることを示すエラーが表示された場合、サイトが ASP.NET Web ページ メンバーシップ システム (SimpleMembership) を使用するように構成されていない可能性があります。 これは、ホスティング プロバイダーのサーバーがローカル サーバーとは異なる方法で構成されている場合に発生することがあります。 これを解決するには、サイトのWeb.configファイルに次の要素 追加します。

    <appSettings>
        <add key="enableSimpleMembership" value="true" />
    </appSettings>
    

    この要素を要素の <configuration> 子として追加し、要素の <system.web> ピアとして追加します。

  9. ページの右上隅にある [ 登録 ] リンクをクリックします。 Register.cshtml ページが表示されます。

  10. ユーザー名とパスワードを入力し、[ 登録] をクリックします。

    security-membership-3

    スタート サイト テンプレートから Web サイトを作成すると、サイトの App_Data フォルダーに StarterSite.sdf という名前のデータベースが作成されました。 登録中に、ユーザー情報がデータベースに追加されます。 SMTP 値を設定すると、登録を完了できるように、使用したメール アドレスにメッセージが送信されます。

    security-membership-4

  11. メール プログラムに移動し、確認コードとサイトへのハイパーリンクが表示されるメッセージを見つけます。

  12. ハイパーリンクをクリックしてアカウントをアクティブ化します。 確認のハイパーリンクが開き、登録の確認ページが開きます。

    security-membership-5

  13. [ ログイン ] リンクをクリックし、登録したアカウントを使用してログインします。

    ログインすると、[ ログイン ] リンクと [登録 ] リンクが [ログアウト ] リンクに置き換えられます。 ログイン名がリンクとして表示されます。 (このリンクを使用すると、パスワードを変更できるページに移動できます)。

    security-membership-6

    Note

    既定では、ASP.NET Web ページは、(人間が判読できるテキストとして) クリア テキストでサーバーに資格情報を送信します。 運用サイトでは、セキュリティで保護された HTTP (セキュリティで 保護されたソケットレイヤー または SSL とも呼ばれる https://) を使用して、サーバーと交換される機密情報を暗号化する必要があります。 前の例のように を設定 WebMail.EnableSsl=true することで、SSL を使用して電子メール メッセージを送信する必要があります。 SSL の詳細については、「 Web 通信のセキュリティ保護: 証明書、SSL、および https://」を参照してください。

サイトの追加のメンバーシップ機能

サイトには、ユーザーが自分のアカウントを管理できるその他の機能が含まれています。 ユーザーは次の操作を行うことができます。

  • パスワードを変更します。 ログイン後、ユーザー名 (リンク) をクリックできます。 これにより、新しいパスワード (Account/ChangePassword.cshtml) を作成できるページに移動します。
  • 忘れたパスワードを回復します。 ログイン ページには、ユーザーがメール アドレスを入力できるページ (Account/ForgotPassword.cshtml) に移動するリンク (パスワードを忘れましたか? ) があります。 サイトは、新しいパスワード (Account/PasswordReset.cshtml) を設定するためにクリックできるリンクを含む電子メール メッセージを送信します。

後で説明するように、ユーザーが外部サイトを使用してログインできるようにすることもできます。

Members-Only ページの作成

当分の間、誰でもあなたのウェブサイト内の任意のページを閲覧することができます。 ただし、ログインしたユーザー (つまりメンバー) のみが使用できるページが必要な場合があります。 ASP.NET では、ログインしているメンバーのみがアクセスできるページを作成できます。 通常、匿名ユーザーがメンバー専用ページにアクセスしようとすると、ログイン ページにリダイレクトされます。

この手順では、ログインしているユーザーのみが使用できるページを含むフォルダーを作成します。

  1. サイトのルートで、新しいフォルダーを作成します。 (リボンの [ 新規 ] の下にある矢印をクリックし、[ 新しいフォルダー] を選択します)。

  2. 新しいフォルダーにメンバーという名前を 付けます

  3. Members フォルダー内に新しいページを作成し、MembersInformation.cshtml という名前を付けます

  4. 既存のコンテンツを次のコードとマークアップに置き換えます。

    @{
        if (!WebSecurity.IsAuthenticated) {
            Response.Redirect("~/Account/Login?returnUrl="
                + Request.Url.LocalPath);
        }
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Members Information";
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8" />
        <title>Members Information</title>
      </head>
      <body>
        <p>You can only see this information if you've logged into the site.</p>
      </body>
    </html>
    

    このコードは、 オブジェクトの プロパティをWebSecurityテストIsAuthenticatedします。これは、ユーザーがログインした場合に を返trueします。 ユーザーがログインしていない場合、コードは を呼び出Response.Redirectして、アカウント フォルダーの Login.cshtml ページにユーザーを送信します。

    リダイレクトの URL には、現在の returnUrl ページのパスを設定するために を使用 Request.Url.LocalPath するクエリ文字列値が含まれています。 このようにクエリ文字列の値を returnUrl 設定した場合 (および戻り URL がローカル パスの場合)、ログイン ページはログイン後にこのページにユーザーを返します。

    また、このコード では、_SiteLayout.cshtml ページをレイアウト ページとして設定します。 (レイアウト ページの詳細については、「ASP.NET Web ページ サイトでの一貫性のあるレイアウトの作成」を参照してください)。

  5. サイトを実行します。 まだログインしている場合は、ページの上部にある [ログアウト ] ボタンをクリックします。

  6. ブラウザーで、 ページ /Members/MembersInformation を要求します。 たとえば、URL は次のようになります。

    http://localhost:38366/Members/MembersInformation

    (ポート番号 (38366) は、URL で異なる可能性があります)。

    ログインしていないため、 Login.cshtml ページにリダイレクトされます。

  7. 前に作成したアカウントを使用してログインします。 [MembersInformation] ページにリダイレクトされます。 ログインしているため、今度はページの内容が表示されます。

複数のページへのアクセスをセキュリティで保護するには、次の操作を行います。

  • 各ページにセキュリティ チェックを追加します。
  • 保護されたページを保持するフォルダーに _PageStart.cshtml ページを作成し、そこにセキュリティ チェックを追加します。 _PageStart.cshtml ページは、フォルダー内のすべてのページのグローバル ページの一種として機能します。 この手法の詳細については、「ASP.NET Web ページのSite-Wide動作のカスタマイズ」を参照してください。

ユーザーのグループのセキュリティの作成 (ロール)

サイトに多数のメンバーが含まれる場合は、ページを表示する前に、各ユーザーのアクセス許可を個別にチェックすることは効率的ではありません。 代わりにできることは、個々のメンバーが属するグループ ( ロール) を作成することです。 その後、ロールに基づいてアクセス許可をチェックできます。 このセクションでは、"管理者" ロールを作成し、そのロールに属している (属している) ユーザーがアクセスできるページを作成します。

ASP.NET メンバーシップ システムは、ロールをサポートするように設定されています。 ただし、メンバーシップの登録やログインとは異なり、 スターター サイト テンプレートには、ロールの管理に役立つページは含まれていません。 (ロールの管理は、ユーザー タスクではなく管理タスクです)。ただし、WebMatrix のメンバーシップ データベースにグループを直接追加できます。

  1. WebMatrix で、[ データベース ] ワークスペース セレクターをクリックします。

  2. 左側のウィンドウで StarterSite.sdf ノードを開き、[ テーブル ] ノードを開き、 webpages_Roles テーブルをダブルクリックします。

    security-membership-7

  3. "admin" という名前のロールを追加します。 RoleId フィールドは自動的に入力されます。 (これは主キーであり、「ASP.NET Web ページ サイトでのデータベースの操作の概要」で説明されているように、識別フィールドに設定されています)。

  4. RoleId フィールドの値を書き留めておきます。 (これが最初に定義するロールの場合は、1 になります)。

    security-membership-8

  5. webpages_Roles テーブルを閉じます。

  6. UserProfile テーブルを開きます。

  7. テーブル内の 1 つ以上の ユーザーの UserId 値を書き留め、テーブルを閉じます。

  8. webpages_UserInRoles テーブルを開き、UserIDRoleID 値をテーブルに入力します。 たとえば、ユーザー 2 を "管理者" ロールに入れるには、次の値を入力します。

    security-membership-9

  9. webpages_UsersInRoles テーブルを閉じます。

    ロールが定義されたので、そのロールに含まれるユーザーがアクセスできるページを構成できます。

  10. Web サイトのルート フォルダーで、 AdminError.cshtml という名前の新しいページを作成し、既存のコンテンツを次のコードに置き換えます。 これは、ユーザーがページへのアクセスを許可されていない場合にリダイレクトされるページです。

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Admin-only Error";
    }
    <p>You must log in as an admin to access that page.</p>
    
  11. Web サイトのルート フォルダーで、 AdminOnly.cshtml という名前の新しいページを作成し、既存のコードを次のコードに置き換えます。

    @{
        Layout = "~/_SiteLayout.cshtml";
        PageData["Title"] = "Administrators only";
    }
    
    @if ( Roles.IsUserInRole("admin")) {
        <span> Welcome <b>@WebSecurity.CurrentUserName</b>! </span>
    }
    else {
         Response.Redirect("~/AdminError");
    }
    

    現在のtrueユーザーが指定したロール (この場合は "admin" ロール) のメンバーである場合、 メソッドは Roles.IsUserInRole を返します。

  12. ブラウザーで Default.cshtml を実行しますが、ログインしないでください。 (既にログインしている場合は、ログアウトします)。

  13. ブラウザーのアドレス バーで、URL に AdminOnly を追加します。 (つまり、 AdminOnly.cshtml ファイルを 要求します)。"admin" ロールのユーザーとして現在ログインしていないため、 AdminError.cshtml ページにリダイレクトされます。

  14. Default.cshtml に戻り、"admin" ロールに追加したユーザーとしてログインします。

  15. [AdminOnly.cshtml] ページに移動します。 今度は、ページが表示されます。

自動プログラムが Web サイトに参加できないようにする

ログイン ページでは、自動化されたプログラム ( Web ロボット または ボットとも呼ばれます) が Web サイトに登録されなくなります。 この手順では、登録ページで ReCaptcha テストを有効にする方法について説明します。

/media/38777/ch16securitymembership-18.jpg

  1. Web サイトを ReCaptcha サービスに登録します。 登録が完了すると、公開キーと秘密キーが取得されます。

  2. ASP.NET Web ヘルパー ライブラリを Web サイトに追加します (まだ行っていない場合は、「ASP.NET Web ページ サイトにヘルパーをインストールする」を参照してください)。

  3. [アカウント] フォルダーで、Register.cshtml という名前のファイルを開きます。

  4. ページの上部にあるコードで、次の行を見つけ、コメント文字を削除してコメントを // 解除します。

    if (!ReCaptcha.Validate("PRIVATE_KEY")) {
        ModelState.AddError("recaptcha", "Captcha response was not correct");
    }
    
  5. を独自の ReCaptcha 秘密キーに置き換えます PRIVATE_KEY

  6. ページのマークアップで、ページ マークアップ内の @* 次の行の周囲から および *@ コメント文字を削除します。

    @ReCaptcha.GetHtml("PUBLIC_KEY", theme: "white")
    @Html.ValidationMessage("recaptcha")
    
  7. PUBLIC_KEY をご自分のキーに置き換えます。

  8. まだ削除していない場合は、"CAPTCHA 検証を有効にするには ..." で始まるテキストを含む要素を削除 <div> します。 (要素全体 <div> とその内容を削除します。

  9. ブラウザーで Default.cshtml を実行します。 サイトにログインしている場合は、[ ログアウト ] リンクをクリックします。

  10. [ 登録 ] リンクをクリックし、CAPTCHA テストを使用して登録をテストします。

    security-membership-10

ヘルパーの ReCaptcha 詳細については、「 CATPCHA を使用して自動プログラム (ボット) が ASP.NET Web サイトを使用できないようにする」を参照してください。

外部サイトを使用してユーザーがログインできるようにする

スタート サイト テンプレートには、ユーザーが Facebook、Windows Live、Twitter、Google、Yahoo を使用してログインできるようにするコードとマークアップが含まれています。 既定では、この機能は有効になっていません。 ユーザーがこれらの外部プロバイダーを使用してログインできるようにする一般的な手順は次のとおりです。

  • サポートする外部サイトを決定します。
  • 必要に応じて、そのサイトに移動し、ログイン アプリを設定します。 (たとえば、Facebook ログインを許可するには、これを行う必要があります)。
  • サイトでプロバイダーを構成します。 ほとんどの場合、 _AppStart.cshtml ファイル内のコードのコメントを解除するだけです。
  • 登録ページにマークアップを追加して、ユーザーがログインのために外部サイトにリンクできるようにします。 通常、必要なマークアップをコピーし、テキストを少し変更できます。

詳しい手順については、ASP.NET Web ページ サイトの「外部サイトからのログインの有効化」を参照してください。

ユーザーが別のサイトからログインすると、ユーザーはサイトに戻り、そのログインをサイトに 関連付けます 。 実際には、これにより、ユーザーの外部ログイン用のメンバーシップ エントリがサイトに作成されます。 これにより、外部ログインでメンバーシップの通常の機能 (ロールなど) を使用できます。

既存の Web サイトへのセキュリティの追加

この記事の前の手順では、Web サイトのセキュリティの基礎として スターター サイト テンプレートを使用します。 スターター サイト テンプレートから開始したり、そのテンプレートに基づいてサイトから関連ページをコピーしたりするのが実用的でない場合は、自分でコーディングすることで、独自のサイトに同じ種類のセキュリティを実装できます。 同じ種類のページ (登録、ログインなど) を作成し、ヘルパーとクラスを使用してメンバーシップを設定します。

基本的なプロセスについては、 Razor セキュリティを実装するための最も基本的な方法 ASP.NET ブログ記事で説明されています。 ほとんどの作業は、ヘルパーの次のメソッドとプロパティを WebSecurity 使用して行われます。

ロールを管理するには、ブログエントリで説明されているように、 Roles クラスと Membership クラスを使用できます。

その他のリソース