4. チュートリアルアプリケーション「NerdDinner」を実行する前に
NerdDinnerを動かす前に、素のASP.NET MVCプロジェクトでの動作確認を行います。
Visual Web Developer 2008 Express editionで作成したASP.NET MVCプロジェクト用ソリューションをMonoDevelopから開き、プロジェクトのビルドおよび実行が可能です。Monoから提供されているxsp2簡易Webサーバが起動し、デフォルトブラウザに設定されているブラウザが起動します。
ここで確認しておきたいのは、標準の認証機能およびUnit Testプロジェクトの実行です。
認証機能
認証にMembershipを使用していますが、Mono環境では次の既存の設定により、標準のMembershipプロバイダとしてSQLite DBにユーザ情報を格納するSqliteMembershipProviderを使用するようになっています。
<?xml version="1.0" encoding="utf-8" ?> <settingsMap> <map sectionType="System.Web.Configuration.MembershipSection, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mapperType="Mono.Web.Util.MembershipSectionMapper, Mono.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" platform="Unix"> <!-- The 'what' tag specifies which region of the section to modify. The 'value' attribute value is mapper-specific and is not defined here. It can be any expression understood by the mapper to designate the section region to modify. --> <what value="providers"> <!-- 'what' can contain any number of occurrences of any three elements: replace - replace the designated region add - add a new entry to the region clear - clear the region remove - remove the designatedregion The attributes to any of the above are freeform and are not processed by the mapper manager. They are stored verbatim for the mapper to peruse. --> <replace name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqliteMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqliteServer" /> </what> </map> ... <settingsMap>
<connectionStrings> <add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/> <add name="LocalSqliteServer" connectionString="Data Source=|DataDirectory|/aspnetdb.sqlite;version=3" providerName="Mono.Data.Sqlite"/> </connectionStrings>
これらの設定によりSqlMembershipProviderからSqliteMembershipProviderを使用するようになり、Membership用のSQLite DBが必要になります。
Membership用のSQLite DBについては、「Linq to SQL on Mono Update: NerdDinner on Mono」に記述があり、それを抜粋すると次のSQLデータ定義文を実行することで生成できます。
-- sqlite3 aspnetdb.sqlite < aspnetdb.sql -- -- CREATE TABLE Users ( pId character(36) NOT NULL, Username character varying(255) NOT NULL, ApplicationName character varying(255) NOT NULL, Email character varying(128) NOT NULL, Comment character varying(128) NULL, Password character varying(255) NOT NULL, PasswordQuestion character varying(255) NULL, PasswordAnswer character varying(255) NULL, IsApproved boolean NULL, LastActivityDate timestamptz NULL, LastLoginDate timestamptz NULL, LastPasswordChangedDate timestamptz NULL, CreationDate timestamptz NULL, IsOnLine boolean NULL, IsLockedOut boolean NULL, LastLockedOutDate timestamptz NULL, FailedPasswordAttemptCount integer NULL, FailedPasswordAttemptWindowStart timestamptz NULL, FailedPasswordAnswerAttemptCount integer NULL, FailedPasswordAnswerAttemptWindowStart timestamptz NULL, CONSTRAINT users_pkey PRIMARY KEY (pId), CONSTRAINT users_username_application_unique UNIQUE (Username, ApplicationName) ); CREATE INDEX users_email_index ON Users (Email); CREATE INDEX users_islockedout_index ON Users (IsLockedOut); CREATE TABLE Roles ( Rolename character varying(255) NOT NULL, ApplicationName character varying(255) NOT NULL, CONSTRAINT roles_pkey PRIMARY KEY (Rolename, ApplicationName) ); CREATE TABLE UsersInRoles ( Username character varying(255) NOT NULL, Rolename character varying(255) NOT NULL, ApplicationName character varying(255) NOT NULL, CONSTRAINT usersinroles_pkey PRIMARY KEY (Username, Rolename, ApplicationName), CONSTRAINT usersinroles_username_fkey FOREIGN KEY (Username, ApplicationName) REFERENCES Users (Username, ApplicationName) ON DELETE CASCADE, CONSTRAINT usersinroles_rolename_fkey FOREIGN KEY (Rolename, ApplicationName) REFERENCES Roles (Rolename, ApplicationName) ON DELETE CASCADE ); CREATE TABLE Profiles ( pId character(36) NOT NULL, Username character varying(255) NOT NULL, ApplicationName character varying(255) NOT NULL, IsAnonymous boolean NULL, LastActivityDate timestamptz NULL, LastUpdatedDate timestamptz NULL, CONSTRAINT profiles_pkey PRIMARY KEY (pId), CONSTRAINT profiles_username_application_unique UNIQUE (Username, ApplicationName), CONSTRAINT profiles_username_fkey FOREIGN KEY (Username, ApplicationName) REFERENCES Users (Username, ApplicationName) ON DELETE CASCADE ); CREATE INDEX profiles_isanonymous_index ON Profiles (IsAnonymous); CREATE TABLE ProfileData ( pId character(36) NOT NULL, Profile character(36) NOT NULL, Name character varying(255) NOT NULL, ValueString text NULL, ValueBinary bytea NULL, CONSTRAINT profiledata_pkey PRIMARY KEY (pId), CONSTRAINT profiledata_profile_name_unique UNIQUE (Profile, Name), CONSTRAINT profiledata_profile_fkey FOREIGN KEY (Profile) REFERENCES Profiles (pId) ON DELETE CASCADE );
作成した「aspnetdb.sqlite」ファイルを「プロジェクトルート/App_Data」ディレクトリへ配置します。
また、認証パスワードの暗号/復号化のための永続的なキーを保持するために、「プロジェクトルート/Web.config」にmachineKeyの設定が必要になります。
<system.web> <machineKey validationKey="A8A175A34D8CD7F6600DC9B5E5AA19F6793D18677AEE8D08171B1C6E9DB1678CDA3BC8D447B743A76EED18FEE0C419472E44C461C6B15E769DBBCE54EF3C24E8" decryptionKey="1ED97239F02ABF52B09DDA20F2FD983EE8F119AB512FD479" validation="SHA1" /> ... </system.web>
machineKeyの生成には、ASP.NET Resourcesの<machineKey> Generaterなどを利用すればよいでしょう。
詳細については、「Guide: Porting ASP.NET Applications」を参照して下さい。
上記の設定後、MonoDevelopからASP.NET MVCプロジェクトを実行して、認証機能を確認できます。
NerdDinnerもこの認証機能を使用しており、Membership用のSQLite DBおよび同様の設定が必要になります。
Unit Test
NUnit Test Project Templatesをインストールしておくと、ASP.NET MVCプロジェクトを作成する時、同時にNUnit Testプロジェクトも作成できます(インストール方法については「VWD Express + ASP.NET MVC + NUnit Support」で簡単にまとめましたので参考にして下さい)。
Mono 2.4.2.3ではNUnit 2.4.8が標準で組み込まれており、MonoDevelopからNUnit Testプロジェクトの単体テストが実行可能です(メニュー[ビュー]-[単体テスト]を選択)。
NerdDinnerに含まれるUnit Testプロジェクトは、Visual Studio Team Systemテストツールを使用して作成されていますが、機械的な修正で、NUnit Testプロジェクトとして単体テストが実行可能になります。