ASP.NET EC のホームへ戻る

■セキュリティ

 

「ドットネット書店」は、Webサイトから書籍を検索して「買い物かご」に入れるまでは、匿名ユーザー(ログイン不要)として処理させます。「買い物かご」に入れた書籍を注文する処理は、認証ユーザー(ログイン要)として処理させます。

 

ASP.NETでユーザーを認証させるには、Windows認証とフォーム認証などがあります。イントラネットの環境で運用するシステムはWindows認証が適していますが、インターネット経由で不特定のユーザーが利用するシステムは、フォーム認証を使用します。Webシステムにフォーム認証を組み込むには、Web.configファイルの<system.web>セクションに「authentication mode="Forms"」要素を追加します。また、オプションとして<forms>要素の「loginUrl」属性にログインフォームを指定することができます。「loginUrl」属性を省略すると、デフォルトとしてLogin.aspxがログインフォームになります。

 

本システムでは、WebサイトにAdminフォルダとMembersフォルダを作成して認証が必要なWebページをサブフォルダに格納しています。AdminフォルダのWeb.configファイルには「allow roles="Admin"」要素を追加してAdminロールのユーザーのみアクセスを許可します。MembersフォルダのWeb.configファイルには、「deny users="?"」要素を追加して認証(ログイン)されているユーザーのみアクセスを許可します。

 

Web.config (ルートフォルダ下)

<authentication mode="Forms">

  <forms loginUrl="Login.aspx" />

</authentication>

 

Web.config(Adminフォルダ下)

<authorization>

  <allow roles="Admin"/>

  <deny users="*"/>

</authorization>

 

Web.config(Membersフォルダ下)

<authorization>

  <deny users="?"/>

</authorization>

 

3:「ドットネット書店」のフォルダ構成

fig2-1

 

 

●ユーザー/ロールの追加 (ASP.NET Webサイト管理ツール)

 

フォーム認証を検証するために本システムでは、表1に示すユーザーとロールを作成しています。ユーザーとロールを作成するには、VWD 2005[Webサイト]メニューから[ASP.NET構成]を選択します。ブラウザが起動されて「ASP.NET Webサイト管理ツール」が表示されたら、「セキュリティ」タブをクリックして「ユーザー」から[ユーザーの作成]※をクリックします。

 

Web.configファイルに「<authentication mode="Forms">」要素を追加しないと、新規ユーザーは作成できません。

 

表1 ユーザー名とロール

ユーザー名

パスワード

ロール

Superman

password!

AdminMembers

Administrator

password!

Admin

Hanako

password!

Members

Taro

password!

Members

 

「ユーザーの作成」が表示されたら、「ユーザー名」、「パスワード」、「パスワードの確認入力」、「電子メール」などを入力して[ユーザーの作成]ボタンをクリックします。

 

4:「ASP.NET Webサイト管理ツール」の新規ユーザー作成フォーム

fig3

 

すべてのユーザーを作成したら、「ロール」から新規ロールを作成して表1のユーザーを登録します。

 

5:「ASP.NET Webサイト管理ツール」の新規ロール作成フォーム

fig4

 

ASP.NET Webサイト管理ツール」で作成したユーザーとロールは、App_Dataフォルダ下のASPNETDB.MDFデータベースのaspnet_Useraspnet_Membershipテーブルとaspnet_Rolesテーブルに格納されます。テーブルの内容を確認するには、VWD 2005のデータベースエクスプローラからテーブルを表示して、右クリックから[テーブルデータの表示]を選択します。

 

6:データベースエクスプローラからaspnet_Usersテーブルを表示

fig5-1

 

 

●ログイン (Login.aspx)

 

本システムでは、すべてのWebページからログインできるようにマスタページに[ログイン]のリンクを追加します。[ログイン]のリンクを表示するには、LoginViewコントロールのAnonymousTemplateLoginStatusコントロールを追加します。AnonymousTemplateはユーザーがまだ認証されていないときに適用させるテンプレートです。この場合、LoginStatusは、[ログイン]のリンクを表示します。

 

LoggedInTemplateは、ユーザーがすでに認証されているときに適用されるテンプレートです。この場合、LoginStatus[ログアウト]のリンクを表示します。LoginNameコントロールはユーザー名を表示します

 

<asp:LoginView ID="LoginView1" runat="server">

  <AnonymousTemplate>

    <asp:LoginStatus ID="LoginStatus2" runat="server" />

  </AnonymousTemplate>

  <LoggedInTemplate>

    <asp:LoginName ID="LoginName1" runat="server" /><br />

    <asp:LoginStatus ID="LoginStatus1" runat="server" /> <br />

  ・・・

  </LoggedInTemplate>

</asp:LoginView>

 

トップページから[ログイン]をクリックすると、Login.aspxがロードされてログイン画面が表示されますので、ユーザー名に「Hanako」、パスワードに「password!」を入力して[ログイン]ボタンをクリックします。ユーザーが認証されると、要求元のWebページがロードされます。

 

Login.aspxの代わりにMyLogin.aspxを使用するときは、Web.configファイルの<forms>要素に「loginUrl="MyLogin.aspx"」属性を追加します。

 

<authentication mode="Forms">

  <forms loginUrl="MyLogin.aspx" />

</authentication>

 

 

7:ログイン画面から「ユーザー名」と「パスワード」を入力

fig5

 

Hanako」さんが認証されると、画面左上に「ユーザー名」が表示されます。また、[ログイン]の代わりに[ログアウト]のリンクが表示されます。

 

8:ユーザーが認証されると[ログイン]のリンクが[ログアウト]に切り替わる

fig6

 

Login.aspxからログイン情報を入力させるには、Loginコントロールを配置します。Loginは、フォーム認証を行うために必要な「ユーザー名」と「パスワード」を入力するテキストボックスと[ログイン]ボタンを表示します。

 

<asp:Login ID="Login1" runat="server" />

 

ユーザーが認証されると要求元のWebページがロードされます。たとえば、Default.aspxからログインが要求されたときは、Default.aspxがロードされます。直接Login.aspxを開いたときは、LoginコントロールのDetinationPageUrlプロパティに格納されているWebページをロードします。本システムでは、DestinationPageUrlに「~/Default.aspx」を設定してトップページをロードさせるようにしています。

 

<asp:Login ID="Login1" runat="server"

  DestinationPageUrl="~/Default.aspx" />

 

パスワードを忘れたときにパスワードをメールで通知したりユーザー名を新規登録させるには、Buttonコントロールを追加して、RecoverPassword.aspxNewUser.aspxをロードします。ButtonPostBackUrlプロパティは、ASP.NET 2.0で追加された機能で直接指定されたページをロードします。

 

<asp:Button ID="Button2" runat="server"

  Text="パスワードを忘れた"

  PostBackUrl="~/RecoverPassword.aspx" />

 

<asp:Button ID="Button1" runat="server"

  Text="ユーザーの新規登録"

  PostBackUrl="~/NewUser.aspx" />

 

●パスワードの通知 (RecoverPassword.aspx)

 

パスワードを忘れたときにWebメール経由でパスワードを通知するには、PasswordRecoveryコントロールを配置します。

 

<asp:PasswordRecovery ID="PasswordRecovery1"

  runat="server" />

 

PasswordRecoveryは、「ユーザー名」を入力するテキストボックスと[送信]ボタンを表示します。ユーザー名として「Hanako」を入力して[送信]ボタンをクリックすると、「ペットの名前」の質問が表示されますので「モモ」を入力して[送信]ボタンをクリックします。しばらくするとユーザー登録時に入力したメールアドレスにパスワードが送信されます。

 

※パスワードの通知機能を利用するには、Web.configファイルの<system.net>セクションに<mailSettings>…</mailSettings>要素を追加する必要があります。<mailSetting>の設定は、VWD 2005[Webサイト]メニューから[ASP.NET構成]を選択して[アプリケーション]-[SMTP電子メール設定]をクリックして行うこともできます。

 

<mailSettings>

  <smtp from="webmaster@fs.com">

    <network host="localhost" password="" userName="" />

  </smtp>

</mailSettings>

 

パスワードは、ASPNEDB.MDFデータベースのaspnet_Membershipテーブルにハッシュ(デフォルト値)されて格納されています。Webメールでパスワードを通知するには、Web.configファイルの<add>タブに「passwordFormat="Clear"」属性を追加してパスワードをハッシュしない状態(プレーンテキスト)で保存する必要があります。

 

<membership

  defaultProvider="SqlProvider">

  <providers>

    <clear />

    <add

      name="SqlProvider"

      type="System.Web.Security.SqlMembershipProvider"

      passwordFormat="Clear"

      />

  </providers>

</membership>

 

パスワードを手動で送信するには、System.Net.Mail.MailMessageクラスのSendメソッソを使用して送信します。

 

Dim smtp As New System.Net.Mail.SmtpClient

Dim strFrom As String = ConfigurationManager.AppSettings("emailFrom").ToString()

Dim strTo As String = txtEmail.Text

Dim strName As String = txtName.Text

Dim strSubject As String = "パスワード送付の件"

Dim strMessage As String = "パスワードは○○です"

Dim strBody As String = strName & vbNewLine & vbNewLine & strMessage

 

Dim email As New System.Net.Mail.MailMessage(strFrom, strTo)

Dim mailClient As New System.Net.Mail.SmtpClient()

 

email.Subject = strSubject

email.Body = strBody

mailClient.Host = ConfigurationManager.AppSettings("emailServer").ToString()

mailClient.Send(email)

 

差出人のメールアドレスとメールサーバー名は、保守性を考慮してWeb.configファイルに登録します。

 

<appSettings>

  <add key="emailServer" value="localhost" />

  <add key="emailFrom" value="webmaster@fs.com" />

</appSettings>

 

 

●ユーザーの新規登録 (NewUser.aspx)

 

ユーザーを新規登録するには、WebページにCreateUserWizardコントロールを配置します。CreateUserWizardで登録したユーザー情報は、ASPNETDB.MDFデータベースのaspnet_Useraspnet_Membershipテーブルに分離されて格納されます。

 

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">

  <WizardSteps>

    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server" />

    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server" />

  </WizardSteps>

</asp:CreateUserWizard>

 

 

●パスワードの変更 (ChangePassword.aspx)

 

パスワードを変更させるには、WebページにChangePasswordコントロールを配置します。パスワードの変更は、すでにログインしているユーザーのみ対象とするためにChangePassword.aspxMembersフォルダに格納します。

MembersフォルダのWeb.configファイルには、<deny users="?"/>要素が追加されていますのでChangePassword.aspxを開くと自動的にLogin.aspxがロードされてログイン画面が表示されます。

 

<authorization>

  <deny users="?"/>

</authorization>

 

<asp:ChangePassword ID="ChangePassword1" runat="server" />

 

 

●セキュリティトリミングの適用

 

セキュリティトリミングを有効にするとログインしているユーザーのロールにより、表示するメニュー項目を自動的に調整させることができます。たとえば、本システムのマップファイルには、サイト管理者専用のメニュー項目「サイト管理」がありますが、このメニュー項目要素(siteMapNode)の「url」属性には「~/Admin/Admin.aspx」を設定しています。AdminフォルダのWeb.configファイルには「allow roles="Admin"/」要素を追加してAdminロールのユーザーしかアクセスを許可していません。この場合、Adminロールのユーザーに対してのみ「サイト管理」のメニュー項目が表示されます。つまり、「Superman」と「Administrator」がログインしたときのみ「サイト管理」のメニュー項目が表示されます。すべての、ユーザーに対してメニュー項目を表示させるには、サイトマップの<siteMapNode>要素に「roles="*"」属性を追加します。「私のブログ」のメニュー項目はすべてのユーザーに対して表示されます。

 

Web.sitemapファイルの内容

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >

  <siteMapNode url="~/Dummy.aspx" title="Dummy Page" 

description="不具合を回避するためのダミーページ">

    <siteMapNode url="~/Default.aspx" title="ホーム" />

  ・・・

    <siteMapNode url="~/Admin/Admin.aspx" title="サイト管理"  />

    <siteMapNode url="http://blog.friendlysw.com/" title="私のブログ" roles="*" />

  </siteMapNode>

</siteMap>

 

  Web.sitemap<siteMapNode>要素に空白のURLを指定するとセキュリティトリミングが正常に動作しない不具合がありますので、ここではダミー「url="~/Dummy.aspx"」を指定しています。

 

セキュリティトリミング機能を有効にするには、Web.configファイルに「roleManager enabled="true"」要素を追加します。さらに、<siteMap><providers><add>タブに「securityTrimmingEnabled="true"」属性を追加します。

 

<roleManager enabled="true" />

<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">

  <providers>

    <add name="XmlSiteMapProvider"

      description="Default SiteMap provider."

      type="System.Web.XmlSiteMapProvider"

      siteMapFile="Web.sitemap"

      securityTrimmingEnabled="true" />

  </providers>

</siteMap>

 

 

9:セキュリティトリミングが適用されてメニュー項目がロール別に調整された

fig9

 

ASP.NET EC のホームへ戻る