質問:
フォーム認証と独自のカスタム メンバーシップ プロバイダーをいじっています。
私が見たところ、次のようにして現在の FormsIdentity を取得できます。
System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity)
System.Web.HttpContext.Current.User.Identity;
そして、これを行う現在のメンバーシップ ユーザーを取得できます。
var UserFromDb = System.Web.Security.Membership.GetUser();
そして、これを行うことでユーザーIDを取得できます:
var MyUserId = UserFromDb.ProviderUserKey;
私が面白いと思うのは、Membership.GetUser() を呼び出すと、メンバーシップ プロバイダーでこのメソッドが呼び出されることです。
public override MembershipUser GetUser(string username, bool userIsOnline)
データベースでユーザー情報を検索します。
だから私が考えたのは、.NETフレームワークが内部的に行うということです
GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever);
USERNAME に基づいてデータベースからユーザー情報を取得します。まず、ユーザー ID を取得するためだけにユーザー全体を検索する必要がある場合、パフォーマンスが低下するため、これは気がかりです。
第二に、ユーザー ID をまったく検索しなければならないのは気がかりなことです。
第三に、ユーザー名はプログラムの過程で変更される可能性があり、ユーザーがログアウトしてログインしなければならないのはナンセンスです。
さて、私にはこのデザインはナンセンスに思えます。
しかし、マイクロソフトはアプリケーション名、グループ名、およびユーザー名も主キーとして使用しますが、これもあまり意味がありません。
ここで私の質問:
DB ルックアップなしでユーザー ID を取得する方法はありませんか?
それとも、メンバーシップ プロバイダーのアイデア全体が、設計上壊れているのでしょうか?
非常に壊れている場合:
FormsIdentity に userdata という文字列プロパティがあることがわかりました。もしそうなら、ASP.NET を使用してそこにユーザー ID を保存するにはどうすればよいですか?