<この記事は、かつて、わんくまBlogで掲載していたものです。こちらに一部内容をアレンジして移行致します。>
ネタ元: ASP.NET: WebPartZoneコントロール (けろ-みお)
前回、WebPartZoneコントロールを使った例をご紹介したのですが、
WebPartZoneコントロール内に貼り付けているコントロールを「最小化」、「閉じる」をしたりするには、
「パーソナル化」(Personalize)が必要だと説明しました。
「パーソナル化」(Personalize)をサポートすると、コントロールがあるページにアクセスする度、
前回設定した情報(最小化とか閉じるの状態)を取得したり、また、ログアウト後も
状態を永続的に保存するため、セッション等の一時的な保存エリアではなく、
App_Dataフォルダの下に、「SQL Server Express データベース ファイル」(ASPNETDB.MDF)が自動的に作成され、
ASPNETDB.MDF内に、「パーソナル化」(Personalize)した状態がSQL Provider経由で、保存されます。
しかし、稼動サーバー(特にレンタルサーバー)の制限やセキュリティ上の問題等により、App_Dataフォルダの自動作成や
「SQL Server Express データベース ファイル」(ASPNETDB.MDF)の自動作成を認めていないサーバーもあります。
今回、Personalizeした情報を、ASPNETDB.MDF ではなく、
任意のサーバーに設置されているDBサーバ&SQL Server データベースに保存するやり方を説明します。
■実行サンプルをとにかく早く見たい方
サンプルだけでも先に見せなさいよ!待ちきれないだぜ!ちくしょーww という方は、
http://techbank.jp/WebPartsSample/
に実行サンプルがありますので、そに実行サンプルがありますので、そちらでご確認ください。
ユーザ: mio@techbank.jp
パスワード:1234-5678
で、ログインすると、見れます。
(各WebPartsの閉じるボタンは、押さないで下さい。のちに押しても大丈夫なように対応します)
アクセスするのも面倒だぜぃ~って人には、下記が実行イメージです。

特に、今エントリでは、下準備(データ移行等)がいろいろと必要&長くなりそうなので、今回のエントリは、
その下準備手順だけにします。
(実際、任意のDBサーバーでPersonalizeした情報をASP.NETで、保持するやり方については、
次回のBlogエントリで説明します)
■手順1
☆稼動サーバーに、ターミナルクライアント、リモートデスクトップ接続で、つなげられる場合:
「aspnet_regsql.exe」コマンドで、ASP.NETの「Form認証」に必要なテーブルまたはデータベースを作成します。
詳しくは、ASP.NET SQL Server 登録ツール (Aspnet_regsql.exe) をご覧下さい。
通常、「aspnet_regsql.exe」は、「%windir%\Microsoft.NET\Framework\v2.0.50727」の下にあります。
(インストール環境によっては、異なることもあり)
☆稼動サーバーに、ターミナルクライアント、リモートデスクトップ接続で、つなげられない場合:
作業用クライアントPC上で、「aspnet_regsql.exe」コマンドを実行します。
(SQL Provider(Form認証等)が使用する必要なテーブルを一発作成するための、SQLスクリプトを自動生成します。)
通常、「aspnet_regsql.exe」は、「%windir%\Microsoft.NET\Framework\v2.0.50727」の下にあります。
書式:aspnet_regsql.exe -sqlexportonly [パス\ファイル名] -A all -d [DB名]
実行例:aspnet_regsql.exe -sqlexportonly "C:\aspnet.sql" -A all -d Database1
すると、SQL Server用のテーブルやビュー、ストアド、ロールを作成するスクリプト(この例だと、aspnet.sql) が、
生成されます。
対象テーブル、ストアド、ビュー、ロールは、下記の通りです。
|
| テーブル |
| aspnet_Applications |
| aspnet_Membership |
| aspnet_Paths |
| aspnet_PersonalizationAllUsers |
| aspnet_PersonalizationPerUser |
| aspnet_Profile |
| aspnet_Roles |
| aspnet_SchemaVersions |
| aspnet_Users |
| aspnet_UsersInRoles |
| aspnet_WebEvent_Events |
| ビュー |
| vw_aspnet_Applications |
| vw_aspnet_MembershipUsers |
| vw_aspnet_Profiles |
| vw_aspnet_Roles |
| vw_aspnet_Users |
| vw_aspnet_UsersInRoles |
| vw_aspnet_WebPartState_Paths |
| vw_aspnet_WebPartState_Shared |
| vw_aspnet_WebPartState_User |
| ロール |
| aspnet_Membership_FullAccess |
| aspnet_Membership_BasicAccess |
| aspnet_Membership_ReportingAccess |
| aspnet_Profile_FullAccess |
| aspnet_Profile_BasicAccess |
| aspnet_Profile_ReportingAccess |
| aspnet_Roles_FullAccess |
| aspnet_Roles_BasicAccess |
| aspnet_Roles_ReportingAccess |
| aspnet_Personalization_FullAccess |
| aspnet_Personalization_BasicAccess |
| aspnet_Personalization_ReportingAccess |
| aspnet_WebEvent_FullAccess | |
| ストアド |
| aspnet_AnyDataInTables |
| aspnet_Applications_CreateApplication |
| aspnet_CheckSchemaVersion |
| aspnet_Membership_ChangePasswordQuestionAndAnswer |
| aspnet_Membership_CreateUser |
| aspnet_Membership_FindUsersByEmail |
| aspnet_Membership_FindUsersByName |
| aspnet_Membership_GetAllUsers |
| aspnet_Membership_GetNumberOfUsersOnline |
| aspnet_Membership_GetPassword |
| aspnet_Membership_GetPasswordWithFormat |
| aspnet_Membership_GetUserByEmail |
| aspnet_Membership_GetUserByName |
| aspnet_Membership_GetUserByUserId |
| aspnet_Membership_ResetPassword |
| aspnet_Membership_SetPassword |
| aspnet_Membership_UnlockUser |
| aspnet_Membership_UpdateUser |
| aspnet_Membership_UpdateUserInfo |
| aspnet_Paths_CreatePath |
| aspnet_Personalization_GetApplicationId |
| aspnet_PersonalizationAdministration_DeleteAllState |
| aspnet_PersonalizationAdministration_FindState |
| aspnet_PersonalizationAdministration_GetCountOfState |
| aspnet_PersonalizationAdministration_ResetSharedState |
| aspnet_PersonalizationAdministration_ResetUserState |
| aspnet_PersonalizationAllUsers_GetPageSettings |
| aspnet_PersonalizationAllUsers_ResetPageSettings |
| aspnet_PersonalizationAllUsers_SetPageSettings |
| aspnet_PersonalizationPerUser_GetPageSettings |
| aspnet_PersonalizationPerUser_ResetPageSettings |
| aspnet_PersonalizationPerUser_SetPageSettings |
| aspnet_Profile_DeleteInactiveProfiles |
| aspnet_Profile_DeleteProfiles |
| aspnet_Profile_GetNumberOfInactiveProfiles |
| aspnet_Profile_GetProfiles |
| aspnet_Profile_GetProperties |
| aspnet_Profile_SetProperties |
| aspnet_RegisterSchemaVersion |
| aspnet_Roles_CreateRole |
| aspnet_Roles_DeleteRole |
| aspnet_Roles_GetAllRoles |
| aspnet_Roles_RoleExists |
| aspnet_Setup_RemoveAllRoleMembers |
| aspnet_Setup_RestorePermissions |
| aspnet_UnRegisterSchemaVersion |
| aspnet_Users_CreateUser |
| aspnet_Users_DeleteUser |
| aspnet_UsersInRoles_AddUsersToRoles |
| aspnet_UsersInRoles_FindUsersInRole |
| aspnet_UsersInRoles_GetRolesForUser |
| aspnet_UsersInRoles_GetUsersInRoles |
| aspnet_UsersInRoles_IsUserInRole |
| aspnet_UsersInRoles_RemoveUsersFromRoles |
| aspnet_WebEvent_LogEvent | |
以前、MSDNフォーラムにも投稿したんですが、このaspnet_regsqlで生成されるテーブルの仕様書、
ストアドの仕様書がやはり欲しいという人は多いみたいです。
今度、暇みて、日本語訳やってみるかなぁ。
マイクロソフトがやらないんだったら、やるっきゃないっしょw
■ 手順2
(稼動サーバーに、ターミナルクライアント、リモートデスクトップ接続で、aspnet_regsql.exeを動かして、実際にDBやテーブルを作った方は、手順2は不要)
手順1で作成した、SQLスクリプト(今回だと、aspnet.sql)を、稼動サーバー側で用意されているツール
(myLittleAdmin for SQL Server 2005 等)を使って実行する。
また、稼動サーバーだけでなく、下準備をしている作業用クライアントPCにも、
SQL Server の Management Studio(2005の場合) や Enterprise Manager(2000の場合) を使って、
SQLスクリプト(aspnet.sql)を実行し、SQL Providerが使用する必要なテーブルやビュー、ストアド等を作成しておきます。
(手順3以降で必要になります)

■ 手順3
次に、ASP.NETがSQL Provider経由で、Form認証できる、ログイン可能ユーザを最低1ユーザは作成しておきます。
☆ VS.NETのソリューションエクスプローラーの上にある「ASP.NET構成」アイコンをClick!

☆ セキュリティをClickし、ユーザを作成する。(とりあえず、今回は、ロールなし のユーザを作成しておく)
「セキュリティ」をClick
「ユーザーの作成」をClick
ここで、ユーザ情報を入力し、「ユーザーの作成」ボタンを押す
■手順4
手順3で作ったユーザ情報は、手順2で作成した「aspnet_Applications」「aspnet_Users」「aspnet_Membership」テーブルに、
情報が格納されています。
# ロール情報を付与している場合は、他にも格納されているテーブルがあります。今回は、ロールなしの場合で説明します。
「aspnet_Applications」「aspnet_Users」「aspnet_Membership」テーブルに格納されているユーザー情報を
稼動サーバーに移行したいので、ちょっと面倒ですが、
「aspnet_Applications」「aspnet_Users」「aspnet_Membership」テーブルに登録されているデータを元に、
下記のようなイメージで、ユーザ情報移行用SQL(INSERT文)を作業用クライアントPC側で、作成しておきます。
/************************************************************/
/* Form認証対象のWebアプリケーション(仮想ディレクトリ登録)*/
/************************************************************/
INSERT INTO [dbo].[aspnet_Applications]
(
[ApplicationName],
[LoweredApplicationName],
[ApplicationId],
[Description]
)
VALUES
(
'/WebPartsSample', -- [ApplicationName]
'/webpartssample', -- [LoweredApplicationName]
'281c03a9-a459-4b2a-ac02-b1bfdffe50f9', -- [ApplicationId]
NULL -- [Description]
)
GO
/*******************************************************/
/* Form認証対象のWebアプリケーションにユーザを登録する */
/*******************************************************/
INSERT INTO [dbo].[aspnet_Users]
(
[ApplicationId],
[UserId],
[UserName],
[LoweredUserName],
[MobileAlias],
[IsAnonymous],
[LastActivityDate]
)
VALUES
(
'281c03a9-a459-4b2a-ac02-b1bfdffe50f9', -- [ApplicationId]
'48d45196-6a3d-41c4-89ba-73fbae197232', -- [UserId]
'mio@techbank.jp', -- [UserName]
'mio@techbank.jp', -- [LoweredUserName]
NULL, -- [MobileAlias]
0, -- [IsAnonymous]
'2008/01/03 7:53:03' -- [LastActivityDate]
)
GO
/*******************************************************/
/* Form認証対象のユーザに対するパスワードを登録する */
/*******************************************************/
INSERT INTO [dbo].[aspnet_Membership]
(
[ApplicationId],
[UserId],
[Password],
[PasswordFormat],
[PasswordSalt],
[MobilePIN],
[Email],
[LoweredEmail],
[PasswordQuestion],
[PasswordAnswer],
[IsApproved],
[IsLockedOut],
[CreateDate],
[LastLoginDate],
[LastPasswordChangedDate],
[LastLockoutDate],
[FailedPasswordAttemptCount],
[FailedPasswordAttemptWindowStart],
[FailedPasswordAnswerAttemptCount],
[FailedPasswordAnswerAttemptWindowStart],
[Comment]
)
VALUES
(
'281c03a9-a459-4b2a-ac02-b1bfdffe50f9', -- [ApplicationId]
'48d45196-6a3d-41c4-89ba-73fbae197232', -- [UserId]
'E4DRw4Fo7L1LPQTM/yK3fqLmOiY=', -- [Password]
1, -- [PasswordFormat]
'J+o3XzIPmOE2HmgmpKCJIQ==', -- [PasswordSalt]("1234-5678"と書いてあるw) NULL, -- [MobilePIN]
'mio@techbank.jp', -- [Email]
'mio@techbank.jp', -- [LoweredEmail]
'What''s Your Name?', -- [PasswordQuestion]
'bnLGuqeo6F57JsP6QHUSB9CnF/s=', -- [PasswordAnswer]("けろ"と書いてあるw) 1, -- [IsApproved]
0, -- [IsLockedOut]
'2008/01/03 7:53:03', -- [CreateDate]
'2008/01/03 7:53:03', -- [LastLoginDate]
'2008/01/03 7:53:03', -- [LastPasswordChangedDate]
'1754/01/01 0:00:00', -- [LastLockoutDate]
0, -- [FailedPasswordAttemptCount]
'1754/01/01 0:00:00', -- [FailedPasswordAttemptWindowStart]
0, -- [FailedPasswordAnswerAttemptCount]
'1754/01/01 0:00:00', -- [FailedPasswordAnswerAttemptWindowStart]
NULL -- [Comment]
)
■手順5
手順4で作成したユーザー情報登録SQLを、稼動サーバー側で用意されているツール(myLittleAdmin for SQL Server 2005 等)を使って実行する。

これで、下準備完了です。任意のデータベースサーバーやDBに、WebPartZoneでPersonalizeさせた情報を
保存させる環境は整いました。
レンタルサーバーや、稼動サーバーに制限があると、本当面倒ですね。
後は、Form認証 + ログインコントロール(たしか、わんくまにいる、のんちゃんが以前Blogで紹介してた記憶あり。)で、
認証させてた後、SQL Provider経由で、WebPartZoneコントロールを、パーソナル化(Personalize)させる方法をご紹介します。
(Web.Configの設定方法がメインですね)
長いエントリで失礼しました。