更新日: 2010 年 11 月 19 日

Visual Basic の内容はこちらに掲載しています。10 行でズバリ!! [VB] Web アプリケーションにおける認証

このコンテンツのポイント

  • フォーム認証のためのメンバーシップ プロバイダーの使い方を理解する
  • ASP.NET Web サイト管理ツールを理解する

今回紹介するコード

C#
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:LoginView ID="LoginView1" runat="server">
        <AnonymousTemplate>
            右上のログインを使って、アカウントを作成するか、ログインしてください。
        </AnonymousTemplate>
        <LoggedInTemplate>
            ようこそ、<asp:LoginName ID="LoginName1" runat="server" /> さん。
        </LoggedInTemplate>
    </asp:LoginView>
</asp:Content>
 

目次

  1. はじめに
  2. サンプル Web アプリケーションの作成準備
  3. ASP.NET で認証を利用する
  4. ASP.NET Web サイト管理ツールを使う
  5. 新しいページの追加
  6. おわりに

1. はじめに

ASP.NET では、Windows 認証やフォーム認証など、さまざまな認証に対応しています。今回は、メンバーシップ プロバイダーという機能を使ったフォーム認証を中心に、ユーザー管理を必要とする一般的な Web アプリケーションの動作について取り上げます。メンバーシップは、ASP.NET が標準的に提供するもので、ユーザー名やパスワードの管理、ログイン、ユーザー作成、パスワード再発行といった、さまざまな機能を持ちます。また、Visual Studio 2010 で ASP.NET Web アプリケーションを作成すると、これらを使用する Web アプリケーションが自動的に作成されます。

ここでは、自動作成される Web アプリケーション プロジェクトを中心に、ASP.NET のメンバーシップ機能について説明します。

ページのトップへ


2. サンプル Web アプリケーションの作成準備

まず、Visual Studio を起動して、[ファイル] メニューの [新規作成] から [プロジェクト] をクリックし、[新しいプロジェクト] を開きます。次に、[インストールされたテンプレート] で [Web] カテゴリーにある [ASP.NET Web アプリケーション] を選びます。[名前] には任意のプロジェクト名を指定できますが、ここでは「SiteMembership」とします。

図 1. [新しいプロジェクト] ダイアログで、Web アプリケーション プロジェクトを新規作成

[OK] をクリックすると、SiteMembership という新しい Web サイト用のプロジェクトと、ソリューションが作成されます。

図 2. プロジェクト作成直後の Visual Studio 2010

ページのトップへ


3. ASP.NET で認証を利用する

ASP.NET では、フォーム認証を使うために詳細な情報は、「フォーム認証プロバイダー」で解説されています。しかし、とくにコードを記述しなくても、前述のウィザードで自動生成される Web アプリケーションでは、フォーム認証に必要なメンバーシップ管理が使えます。

ソリューション エクスプローラーで SiteMembership プロジェクトの Web.config は、次のような内容になっています。

 

<configuration>
  <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>
 
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
 
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>
 
    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider"
         connectionStringName="ApplicationServices" enablePasswordRetrieval="false"
         enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6"
         minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
 
    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider"
         connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>
 
    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider"
         connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider"
         applicationName="/" />
      </providers>
    </roleManager>
 
  </system.web>
 
  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

 

ここで、いくつかの認証方式について確認しておきます。

まず、「<authentication mode="Forms">」という指定はフォーム認証、つまりユーザー名とパスワードを使ってログインする形式であることを意味しており、フォーム認証のために使われるメンバーシップ プロバイダーの定義が <membership> タグに定義されています。

ここで、<authentication> タグを「<authentication mode="Windows">」と書き換えて実行すると、次のようになります。

図 3. Windows 認証を使って Web アプリケーションを実行した様子

アプリケーションの認証には、Windows の認証がそのまま使われるため、右上の赤枠で囲んだ部分には Windows のログイン名がそのまま表示されます。右側に「ログアウト」が表示されているのは、通常、フォーム認証で使われる LoginStatus コントロールを削除していないためです。

もし、<authentication> タグの指定を「<authentication mode="None">」に変更すると、このアプリケーションでは認証は使わないという指定になります。この場合、LoginStatus は「ログイン」を表示しますが、クリックしても機能しません。

この他、Windows Live ID を使うパスポート認証を指定できます (「<authentication mode="Passport">」)。これには、「Windows Live ID SDK」が必要です。

さて、再び <authentication> の記述を「<authentication mode="Forms">」に戻します。アプリケーションを実行すると、次の図のようになります。

図 4. フォーム認証を使って Web アプリケーションを実行した様子

右上には「ログイン」とだけ表示されます。このリンクをクリックすると、次のようなログイン画面が表示されます。

図 5. フォーム認証を使って Web アプリケーションを実行した様子 (ログイン ページの表示)

まだ、誰もユーザー登録していないので、アカウント情報を入力することはできません。「登録します」というリンクをクリックすると、新しいユーザー アカウントを作成するための画面が表示されます。ここで実際に情報を登録することができます。適当な値を使ってアカウントを作成してみてください。

図 6. 新たにユーザー アカウントを登録する

なお、はじめてユーザー登録する際に、ソリューションの「App_Data」フォルダーにデータベースが作られることに注意してください。アカウントを作成した後に、いったんプロジェクトを終了してソリューション エクスプローラーの SiteMembership プロジェクトを右クリックして、[エクスプローラーでフォルダーを開く] を選ぶなど、このプロジェクトの App_Data フォルダーを参照すると次のようにメンバーシップ用のデータベースが作成されています。

※ 実際の運用においては、通常、このようなローカル データではなく、Web.config の <connectionStrings> に既存のデータベースとの接続を追加して利用します。

図 7. メンバーシップ管理用のローカル データが作成された様子

再びアプリケーションを実行して、右上のログインをクリックし、先ほど作成したユーザー アカウント情報を使ってログインします。すると、以下の図のように右上にログイン名が表示されるようになります。

図 8. メンバーシップ機能を使ってログインした様子

ページのトップへ


4. ASP.NET Web サイト管理ツールを使う

先ほどは、Web.config を書き換えて認証方式を変更したり、実際に Web アプリケーションを起動して、アカウント情報を追加しました。Visual Studio は、このような設定をまとめて管理するための「ASP.NET Web サイト管理ツール」が提供しています。これは、[プロジェクト] メニューで [ASP.NET 構成] を呼び出すことで表示されます。

先ほどのようにアカウントをひとつ追加した状態で呼び出すと、次の画面のようになっています。

図 9. ASP.NET Web サイト管理ツール

たとえば、[セキュリティ] タブをクリックすると次のように表示されます。たとえば、「認証の種類の選択」をクリックすると、認証方式を「インターネットから」 (フォーム認証) や「ローカル ネットワークから」 (Windows 認証) のどちらかに切り替えることができます。

図 10. ASP.NET Web サイト管理ツールの [セキュリティ] ページ

また、「ユーザーの作成」や「ユーザーの管理」をクリックすることで、新たなユーザー アカウントを作成したり、既存のユーザー アカウントを変更したりできます。

図 11. ユーザー アカウントの管理ページ

ユーザー アカウントを追加したり、修正したりすることで、Web アプリケーションのログインができることを確認してください。

Note: ASP.NET Web サイト管理ツールは、ローカル環境で実行するためのもので、リモート環境から呼び出すことはできません。詳細は「ASP.NET Web サイト管理ツール」を参照してください。

ページのトップへ


5. 新しいページの追加

認証情報を使った新しいページを作成してみましょう。

ソリューション エクスプローラーで SiteMembership を右クリックし、[追加] - [新しい項目] で、「Web」カテゴリーから「マスター ページを使用した Web フォーム」を選びます。名前には「Welcome.aspx」を指定して、[追加] ボタンを押します。

図 12. 新しくマスター ページを使用した Web フォームを作成する

このプロジェクトには、マスター ページは Site.Master ひとつしかないので、これを選んで [OK] ボタンを押します。

図 13. マスター ページの選択

中央下部の [デザイン] タブをクリックすると、このページの HTML ソースと実際に表示されるデザインが両方表示されます。

図 14. 作成された新しいページ

ここで、ツールボックスの「ログイン」カテゴリーにある LoginView コントロールを、メイン コンテンツの中に配置します (ソースでは、Content2 が示す <asp:Content> タグの中に、デザインでは MainContent の示す領域の中に配置してください)。このコントロールはログイン状態に応じて、コンテンツの内容を切り替えることができます。

ここでは、ソース エディターを使って次のように入力します。

   ……
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
   <asp:LoginView ID="LoginView1" runat="server">
       <AnonymousTemplate>
           右上のログインを使って、アカウントを作成するか、ログインしてください。
       </AnonymousTemplate>
       <LoggedInTemplate>
           ようこそ、<asp:LoginName ID="LoginName1" runat="server" /> さん。
       </LoggedInTemplate>
   </asp:LoginView>

</asp:Content>

デザイン ページで、LoginView コントロールのスマート タグ ([>] ボタン) をクリックし、匿名状態 (AnonymousTemplate) とログイン状態 (LoggedInTemplate) を切り替え、内容が切り替わることを確認してください。

図 15. ログイン状態によってコンテンツが切り替わる LoginView コントロール

また、Site.Master も変更する必要があります。ソリューション エクスプローラーで Site.Master をダブルクリックし、上部のメニュー バーに新しい項目を追加するため、次のように修正します。

                  </LoggedInTemplate>
               </asp:LoginView>
           </div>
           <div class="clear hideSkiplink">
               <asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">
                   <Items>
                       <asp:MenuItem NavigateUrl="~/Default.aspx" Text="ホーム"/>
                       <asp:MenuItem NavigateUrl="~/Welcome.aspx" Text="Welcome" />
                       <asp:MenuItem NavigateUrl="~/About.aspx" Text="このサイトについて"/>
                   </Items>
               </asp:Menu>
           </div>
       </div>

 

図 16. メニュー項目が追加された様子

アプリケーションを実行して、Welcome ページを表示し、ログイン状態によって内容が切り替わることを確認してください。

図 17. アプリケーションを実行して、ログインしている様子

ページのトップへ


6. おわりに

ASP.NET がユーザー管理のための基本機能を備えているだけでなく、ウィザードがユーザー管理を含むプロジェクトを自動生成するため、開発者は典型的なユーザー管理のためにソース コードを書く必要はほとんどありません。なお、Visual Studio 2005/2008 (.NET Framework 2.0 以降) にもメンバーシップ機能はありますが、ウィザードはユーザー管理用のコードを自動生成しないため、「10 行でズバリ!! Web アプリケーションにおける認証と承認 (C#)」などを参照してください。


 

Code Recipe .NET Framework デベロッパー センター

ページのトップへ