2012-02-14 4 views
1

私はasp.netメンバーシップにリンクしたい従来のユーザーID(int32)を持っています。私はデータベースにリンクテーブルを設定しました。私はその部分に満足しています。問題は、必要に応じて簡単にアクセスできるように、WebアプリケーションにUserIDを格納する場所です。asp.netメンバーシップで従来のユーザーIDを保存してアクセスする

私は、ログインコントロールのLoggedInイベントのFormsAuthenticationTicketのUserData部分に格納することをお勧めします。このアクセス可能にする私の最初の試みは、私のBasePageクラスのPreInitでそれを抽出することでした。この問題は、UserControlsでUserIDが必要なときに乱雑になるという問題があります。

public static int UserID 
    { 
     get 
     { 
      int userID = 0; 
      if (HttpContext.Current.User.Identity is FormsIdentity) 
      { 
       FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; 
       FormsAuthenticationTicket ticket = id.Ticket; 
       userID = Int32.Parse(ticket.UserData); 
      } 
      return userID; 
     } 
    } 

これが動作しているようですが、私はいくつかの不文律を破っていた場合、私は知らない。

は、それが許容できるだけのユーティリティクラスの静的メソッドやプロパティでそれをラップするために、このようなものですここで支配する。私はこのすべてのものが記憶されていると推測するので、このアクセスに大きなオーバーヘッドはありません。

答えて

3

あなたのコードは機能上の観点から見えますが(私はそれを少しきれいにしますが、それはもっとスタイルのものです)。

ただし、ランダムなユーティリティクラスに固定するのではなく、拡張メソッドにすることを検討することもできます。たぶんIIdentityクラスの拡張ですか?

int myUserId = HttpContext.Current.User.Identity.MyUserId(); 

UserDataフィールドを使用しても問題ありません。別のオプションは、TicketのカスタムIIdentityオブジェクトを作成してGenericPrincipalにラップすることです。これは後の作業には多大な影響を与える可能性があります。

+0

拡張メソッドはかなり新しくなっていますので、後で参考にするために少し読んだら - http://msdn.microsoft.com/en-us/library/bb383977.aspxを実行する必要がありました。それはいい見えます。残念ながら、彼らは拡張プロパティを持っていません(まだ)。ところで、エラー処理の追加以外に、どのような種類の "それを少しきれいにする"ということを覚えていましたか?私はそれが悪いとは思わなかった。 – Fruitbat

+1

クリーンアップでは、 "is"の代わりに "as"を使用し、HttpContext.Current.Userを2回参照しないようにし、ParseではなくTryParseを使用します。 – RickNZ

関連する問題