ユーザ登録をユーザ名とパスワードのみで行う
ASP.NET 2.0では認証ユーザを簡単につくれるようになりました。CreateUserWizardコントロールを貼り付けるだけでユーザを作成するページができてしまいます。
でも、ユーザ名とパスワードだけでユーザが作りたい、そんな場合はどうするのでしょうか。
まずはCreateUserWizardコントロールのプロパティを変更して何ができるのか探してみると、、、RequireEmailプロパティというのがありました。これをFalseに設定します。そうすると、電子メールの入力欄が消えます。
セキュリティの質問欄を消すには、、、web.configに設定を追加する必要がありました。
<configuration>
<system.web>
<membership>
<providers>
<remove name="AspNetSqlMembershipProvider" />
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
requiresQuestionAndAnswer="false"
requiresUniqueEmail="false" />
</providers>
</membership>
</system.web>
</configuration>
MemberShip関係の設定はAspNetSqlMembershipProviderという名前でmachine.configに記述されています。web.configに上記のように記述することで、machine.config上の設定を取り消し(remove)て、同じ名前の設定を追加(add)することができます。
ここでは必要な設定変更のために最低限の記述としてみました。
requiresQuestionAndAnswerをfalseとすることでセキュリティの質問欄が消えます。また、requiresUniqueEmailをfalseとする記述を追加しておかないと、登録時に有効な電子メールアドレスの入力が求められてしまいます。
電子メールについては、CreateUserWizardコントロールのRequireEmailプロパティとweb.configのrequiresUniqueEmail設定の2箇所の変更が必要なところが注意点ですね。
なお、AspNetSqlMembershipProviderではこの他に以下の設定の変更ができます。
- enablePasswordRetrieval
- enablePasswordReset
- applicationName
- passwordFormat
- maxInvalidPasswordAttempts
- minRequiredPasswordLength
- minRequiredNonalphanumericCharacters
- passwordAttemptWindow
- passwordStrengthRegularExpression
これらの設定がどのように動作に関わるかについては、System.Web.Security.SqlMembershipProviderクラスの同名のプロパティについてのドキュメントが参考になります。
AspNetSqlMembershipProviderのtype属性でSqlMembershipProviderクラスを指定しています。この状態ではMemberShipの機能はSqlMembershipProviderクラスによって実現されているんですね。
レンタルサーバでMemberShip機能を利用するには
ASP.NET 2.0で追加された便利な機能にMemberShipに関する一連のコントロール群があります。
-
Login コントロール
-
LoginName コントロール
-
LoginStatus コントロール
-
CreateUserWizard コントロールhangePassword コントロール
これらのコントロールを利用する際、デフォルトではSQL Server 2005 Express上でASPNETDB.MDFファイルを利用するようになっています。
運用サーバにSQL Expressがインストールされている場合はApp_Dataフォルダに作られるASPNETDB.MDFファイルを利用することが可能です。ただし、この場合はMDFファイルおよびldfファイルのアクセス権に注意する必要があります。具体的にはASP.NETの実行ユーザがMDFファイルとldfファイルに変更/書き込み権限を持つ必要があります。
運用サーバにSQL Expressがインストールされていない場合、aspnet_regsql.exeツールを利用します。
サーバにSQL Server 2005またはSQL Server 2000がインストールされていれば、このツールを使ってウィザード形式で必要なデータベースを作成することができます。
この場合、どのデータベースに接続するかの接続設定をきちんとしてあげる必要があります。具体的にはweb.configにconnectionStrings設定を追加します。
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer"
connectionString="Data Source=サーバ名;Initial Catalog=データベース名;Integrated Security=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
LocalSqlServerという設定はmachine.configに記述されているので、一度設定を解除(remove)し、あらためて設定を追加(add)する必要があります。
と、ここまではマイクロソフトのサイト等でも紹介されている話です。
運用サーバの管理権限をもっていればaspnet_regsql.exeツールからウィザードを実行することも可能ですが、レンタルサーバを利用したいときにはどうすればいいでしょうか?
要はMemberShipの機能を実行するのに必要なテーブルがレンタルサーバ上から使えるデータベース上に作れればいいんですが、そのためにはどうすれば。。。
答えとしては、aspnet_regsql.exeからデータベース、テーブル、ストアドプロシージャを生成するSQLスクリプトを作成することができます!
ただし、レンタルサーバ上でSQLスクリプトを実行してテーブルやストアドプロシージャを生成できることが前提になります。
cervi.jpのレンタルサーバならこれが可能なので、具体的なやり方をみてみましょう。
aspnet_regsql.exe -sqlexportonly ファイル名 -A all -d データベース名
cervi.jp上で利用できるデータベース名を指定して上記のようにコマンドラインから実行すると、指定したファイルにSQLスクリプトが作成されます。このSQLスクリプトをクエリアナライザから実行し、connectionStringに指定されているデータベースを設定すれば利用でき、、、、、、るはずです。
実はこのスクリプトで作成されるテーブルとCommunity Serverが利用しているテーブルの名前がバッティングするため実際に実行して確認できていません。
そのうち機会があったらきちんと確認して、そのときは記事としてまとめたいと思います。