2011-02-08 14 views
1

私は自分のカスタムメンバーシップとロールプロバイダを開発しました。 System.Web.Security.Membershipクラスは、実装していないCreateUserメソッドを呼び出します(目的に応じて、私のMembershipUserに詳細情報が必要です)。メンバーシップクラスはカスタムプロバイダで「間違った」メソッドを呼び出しますか?

このシナリオでは、メンバーシップクラスを使用する必要がありますか?

私の実装したCreateUserメソッドを使用するには、自分のメンバーシッププロバイダに型キャストしてください。私は少し失われた感じ、私はこれをどのように処理する必要がありますか?

((MyMembershipProviderBase)Membership.Provider).CreateUser(username, password, email, lastName, firstName, phoneNumber, out status); 

メンバーシッププロバイダーでCreateUser-方法:

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     throw new NotImplementedException(); 
    } 

    public MyMembershipUser CreateUser(
     string username, string password, string email, string lastName, string firstName, 
     string phoneNumber, out MembershipCreateStatus status) 
    { 
     // implemented... 
    } 

*コメントを@elkdangerする編集

RESPONS。

これはあなたのコメントで参照している種類のラッパーですか?

メンバークラスは、自分の実装にリダイレクトする標準のCreateUserメソッドを呼び出します。問題は、ユーザーの追加情報(firstname、lastename、およびphonenumber)を設定できないことです。これは、どこか他の場所からの追加情報の設定を処理する方法ですか(私はどこでユーザーを作成しますか)?

public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, 
     string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) 
    { 
     return this.CreateUser(username, password, email, "", "", "", out status); 
    } 

    public MyMembershipUser CreateUser(
     string username, string password, string email, string lastName, string firstName, 
     string phoneNumber, out MembershipCreateStatus status 

     ) 
    { 
     var args = 
    new ValidatePasswordEventArgs(username, password, true); 

     OnValidatingPassword(args); 

     if (args.Cancel) 
     { 
      status = MembershipCreateStatus.InvalidPassword; 
      return null; 
     } 


     if (RequiresUniqueEmail && GetUserNameByEmail(email) != "") 
     { 
      status = MembershipCreateStatus.DuplicateEmail; 
      return null; 
     } 

     MembershipUser u = GetUser(username, false); 

     if (u == null) 
     { 

      try 
      { 
       status = Repository.CreateUser(username, EncodePassword(password), email, lastName, firstName, 
     phoneNumber); 
      } 
      catch 
      { 
       status = MembershipCreateStatus.ProviderError; 
      } 
      return (MyMembershipUser)GetUser(username, false); 
     } 
     else 
     { 
      status = MembershipCreateStatus.DuplicateUserName; 
      return null; 
     } 
    } 

答えて

0

このようにして特定のインスタンスにアクセスすると、Asp.Netメンバーシップシステムのポイントをほぼ完全に回避できます。アイデアは、システムがユーザーデータを管理するための既知の契約で動作し、この方法でキャストを開始する必要があるときに、その契約を破棄するという考えです。私はそれが小さな変化かもしれないことに感謝しますが、決してそれほど「臭い」のビットです。

実際には違いはないので、この時点で独自の実装を実行することもできますが、持っているものを固執するだけで時間を節約できます。

これを少しきれいにしたいのであれば、元のCreateUserメソッドに戻って、Asp.Netメンバーシップがオーバーロードを与えるが、メンバシップ機能のラッパーを作成して、必要な詳細をすべて適用するAsp.Netに付属のデフォルトのCreate Userウィザードコントロールを使用している可能性があるため、これを行うことができない場合は、Asp.Netメンバーシップシステムが満たす要件を超えて要件を推し進めることをお勧めしますあなたが達成しようとしているものにもっと適したあなた自身のシステムを工夫して、長期的にはより良くなっています。

幸運を祈る!

+0

コメントありがとうございます!ラッパーがあなたの提案をどのように実装すべきかを完全に理解しているかどうかは分かりませんが、私はこれを試して、上記の私のポストを更新しました。 – user579089

+0

私はCreate Wizardコントロールを使用していません。私は新しいMVCソリューションを使い始めました。そして、Providersの実装に慣れました。目標は、組み込みのユーザーと役割の機能を使用できるようにすることですが、データベースに格納されるユーザー情報(および役割)の方法と方法を制御できます。 – user579089

関連する問題