2010-11-18 25 views
1

カスタムメンバーシッププロバイダを作成しましたが、UserNameではなくMembershipUser.ProviderUserKeyで操作する方が便利です。だから、私はそのようなコードを実行ProviderUserKeyを取得する:ASP.NET User.Identity.Nameの代替?

if (User.Identity.IsAuthenticated) 
{ 
    int UserID = (int)Membership.GetUser(User.Identity.Name).ProviderUserKey; 
} 

GetUser()メソッドが実行されたときしかし、ユーザデータがデータベースから取得する必要があり、これが私を悩ませています。これはサーバー時間を無駄にしていますが、今回はどれほど短くても避けたいと思います。

ProviderUserKeyは、User.Identity.Nameのようにもっと便利な方法がありますか?

あなたのアイデアをお聞きしたいと思います。どのようにあなたのウェブページでこの問題を解決しますか?

ありがとうございました。

答えて

5

メンバーシップAPIは、この情報が格納されている唯一の場所であるため、データベースにヒットしています。 User.Identity.Nameは、リクエストごとに送信されるCookieからログオンしたユーザー名を取得しています。カスタム汎用プリンシパルを実装し、クッキーで暗号化された認証チケットのuserData部分に必要な情報を格納することができます。このトピックをカバーするarticleがあります。

+0

ありがとうございます、これを行うには関連情報を教えてください。私が見つけたのは.NET 1.1です。3.5版のフレームワークでこれをしたいと思います。 – Wodzu

+0

GenericPrincipalを使用してCookieに追加情報を格納する方法を示す[記事](http://www.xoc.net/works/tips/forms-authentication.asp)があります。この考え方は、HttpContext.Current.Userをこのカスタムプリンシパルに置き換えて、どこにでもアクセスできるようにすることです。 –

+0

ありがとう、しかし、私はこの例が自分のloignコントロールを作ることに基づいて理解しています。私は標準の動作をオーバーライドする必要があります...もし私が標準のログインコントロールを使用している場合。後で私のアプリケーションの中で好都合な方法でもう一度そのプロパティを公開するために、クラスをいくつか拡張することはできませんか? – Wodzu

3

最初にログインしてユーザーのセッションコレクションに格納するときに、データベースからProviderUserKeyを読み込みますか?その後のリクエストでは、データベースに行かなくてもセッションから取得できます。

+0

私は同じことを考えていましたが、よりエレガントな方法は、何らかの形でIdentityクラスを拡張することです。 – Wodzu

+0

Identityクラスを拡張する際の問題は、ユーザーが独自のクラスではなく独自のクラスを持つようにする方法がないことです。そのため、独自のIPrincipalを作成する必要があります。その時点で、すべてのカスタムコードの潜在的な問題が、パフォーマンスのわずかな向上よりも重要であると考える必要があります。 – Greg

関連する問題