/// <summary>
        /// 新しいメンバーシップユーザーをデータソースに追加します。
        /// </summary>
        /// <returns>
        /// 新しく作成されたユーザーの情報が格納された <see cref="T:System.Web.Security.MembershipUser"/> オブジェクト。
        /// </returns>
        /// <param name="username">新しいユーザーのユーザー名。</param>
        /// <param name="password">新しいユーザーのパスワード。</param>
        /// <param name="email">新しいユーザーの電子メール アドレス。</param>
        /// <param name="passwordQuestion">新しいユーザーのパスワードの質問。</param>
        /// <param name="passwordAnswer">新しいユーザーのパスワードの解答。</param>
        /// <param name="isApproved">新しいユーザーを承認するかどうか。</param>
        /// <param name="providerUserKey">メンバーシップ データ ソースでのユーザーの一意の識別子。</param>
        /// <param name="status">ユーザーが正常に作成されたかどうかを示す <see cref="T:System.Web.Security.MembershipCreateStatus"/> 列挙値。</param>
        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            status = MembershipCreateStatus.ProviderError;

            // パスワードの保護
            var securePassword = new SecureString();

            securePassword.AppendString(password);

            // 認証の作成
            var membership = new DomainModels.Membership(
                new MembershipEntity
            {
                Name     = username,
                Password = securePassword,
            });
            var result = MembershipCreateStatus.ProviderError;

            membership.Created += (sender, entity) => { result = MembershipCreateStatus.Success; };
            membership.Create();
            status = result;

            var user = default(KandaMembershipUser);

            membership.Found += (sender, entity) => { user = new KandaMembershipUser(entity); };
            membership.Find();

            return(user);
        }
        /// <summary>
        /// 新しいメンバーシップユーザーをデータソースに追加します。
        /// </summary>
        /// <returns>
        /// 新しく作成されたユーザーの情報が格納された <see cref="T:System.Web.Security.MembershipUser"/> オブジェクト。
        /// </returns>
        /// <param name="username">新しいユーザーのユーザー名。</param>
        /// <param name="password">新しいユーザーのパスワード。</param>
        /// <param name="email">新しいユーザーの電子メール アドレス。</param>
        /// <param name="passwordQuestion">新しいユーザーのパスワードの質問。</param>
        /// <param name="passwordAnswer">新しいユーザーのパスワードの解答。</param>
        /// <param name="isApproved">新しいユーザーを承認するかどうか。</param>
        /// <param name="providerUserKey">メンバーシップ データ ソースでのユーザーの一意の識別子。</param>
        /// <param name="status">ユーザーが正常に作成されたかどうかを示す <see cref="T:System.Web.Security.MembershipCreateStatus"/> 列挙値。</param>
        public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
        {
            status = MembershipCreateStatus.ProviderError;

            // パスワードの保護
            var securePassword = new SecureString();
            securePassword.AppendString(password);

            // 認証の作成
            var membership = new DomainModels.Membership(
                new MembershipEntity
                    {
                        Name = username,
                        Password = securePassword,
                    });
            var result = MembershipCreateStatus.ProviderError;
            membership.Created += (sender, entity) => { result = MembershipCreateStatus.Success; };
            membership.Create();
            status = result;

            var user = default (KandaMembershipUser);
            membership.Found += (sender, entity) => { user = new KandaMembershipUser(entity); };
            membership.Find();

            return user;
        }
        /// <summary>
        /// データ ソースからユーザーの情報を取得します。
        /// ユーザーの最終利用日時スタンプを更新するオプションも提供されます。
        /// </summary>
        /// <returns>
        /// データ ソースから取得された指定のユーザーの情報が格納された <see cref="T:System.Web.Security.MembershipUser"/> オブジェクト。
        /// </returns>
        /// <param name="username">
        /// ユーザー情報を取得するユーザーの名前。
        /// </param>
        /// <param name="userIsOnline">
        /// ユーザーの最終利用日時スタンプを更新する場合は true。
        /// ユーザーの最終利用日時スタンプを更新しないでユーザー情報を返す場合は false。
        /// </param>
        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            var membership = new DomainModels.Membership(new MembershipEntity
            {
                Name = username,
            });
            var user = default(KandaMembershipUser);

            membership.Found += (sender, entity) =>
            {
                user = new KandaMembershipUser(entity);
            };
            membership.Find();

            return(user);
        }
        /// <summary>
        /// 指定のユーザー名とパスワードがデータソースに存在しているかどうかを検証します。
        /// </summary>
        /// <returns>
        /// 指定したユーザー名とパスワードが有効な場合は true。それ以外の場合は false。
        /// </returns>
        /// <param name="username">検証対象のユーザー名。</param>
        /// <param name="password">指定したユーザーのパスワード。</param>
        public override bool ValidateUser(string username, string password)
        {
            // 文字列の保護
            var secure = new SecureString();
            secure.AppendString(password);

            // Name、Password 検証
            var entity = new MembershipEntity
                             {
                                 Name = username,
                                 Password = secure,
                             };
            var membership = new DomainModels.Membership(entity);
            membership.Find();

            return (0 < membership.ID);
        }
        /// <summary>
        /// 指定のユーザー名とパスワードがデータソースに存在しているかどうかを検証します。
        /// </summary>
        /// <returns>
        /// 指定したユーザー名とパスワードが有効な場合は true。それ以外の場合は false。
        /// </returns>
        /// <param name="username">検証対象のユーザー名。</param>
        /// <param name="password">指定したユーザーのパスワード。</param>
        public override bool ValidateUser(string username, string password)
        {
            // 文字列の保護
            var secure = new SecureString();

            secure.AppendString(password);

            // Name、Password 検証
            var entity = new MembershipEntity
            {
                Name     = username,
                Password = secure,
            };
            var membership = new DomainModels.Membership(entity);

            membership.Find();

            return(0 < membership.ID);
        }
        public ActionResult Find()
        {
            if (!this.User.Identity.IsAuthenticated)
            {
                throw new AuthenticationException(@"MembershipController.Find()");
            }

            if (this.MembershipID == DomainModels.Memberships.ANONYMOUS)
            {
                return(this.RedirectToRoute(@"DefaultSignIn"));
            }

            var membership = new DomainModels.Membership(new MembershipEntity
            {
                ID = this.MembershipID,
            });
            var view = default(ViewResult);

            membership.Found += (sender, entity) => { view = this.View(@"Membership", entity); };
            membership.Find();

            return(view);
        }
        /// <summary>
        /// データ ソースからユーザーの情報を取得します。
        /// ユーザーの最終利用日時スタンプを更新するオプションも提供されます。
        /// </summary>
        /// <returns>
        /// データ ソースから取得された指定のユーザーの情報が格納された <see cref="T:System.Web.Security.MembershipUser"/> オブジェクト。
        /// </returns>
        /// <param name="username">
        /// ユーザー情報を取得するユーザーの名前。
        /// </param>
        /// <param name="userIsOnline">
        /// ユーザーの最終利用日時スタンプを更新する場合は true。
        /// ユーザーの最終利用日時スタンプを更新しないでユーザー情報を返す場合は false。
        /// </param>
        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            var membership = new DomainModels.Membership(new MembershipEntity
                                                             {
                                                                 Name = username,
                                                             });
            var user = default(KandaMembershipUser);
            membership.Found += (sender, entity) =>
                                    {
                                        user = new KandaMembershipUser(entity);
                                    };
            membership.Find();

            return user;
        }