ASP.NETWebアプリケーションプロジェクトでMembership.GetUser(username)
を使用せずに、ASP.NETメンバーシップでUserId
にアクセスするにはどうすればよいですか?
UserId
をProfile
の隣のUserName
名前空間に含めることができます(System.Web.Profile.ProfileBase
)?
ユーザーユーザーの認証を自分で作成することにしました(非常に単純ですが、機能します)。これはずっと前に行う必要があります。
私の最初の質問はUserIdに関するものでしたが、次のサイトからは入手できません。
System.Web.HttpContext.Current.User.Identity.Name
これを試して:
MembershipUser CurrentUser = Membership.GetUser(User.Identity.Name);
Response.Write("CurrentUser ID :: " + CurrentUser.ProviderUserKey);
UserIdが必要になるたびにデータベース呼び出しを保存する理由はありますか?その場合、ASP.NET MembershipProviderを使用しているときは、通常、その呼び出しをキャッシュできるカスタムプロバイダーを使用するか、キャッシュできるユーティリティメソッドを使用します。
あなたがそれをプロファイルに入れることを考えているなら、私はそうする理由があまりありません、特にそれはまだデータベース呼び出しを必要とし、そこでカスタムプロファイルプロバイダーを使用していない限り、それは追加の処理を持っていますUserIdを解析します。
なぜ彼らがGetUserIdメソッドを実装しなかったのか疑問に思っているのなら、それは単に、含まれているプロバイダーのように、そのユーザーIDがGUIDになることが常に保証されているわけではないからです。
編集:
プロバイダーに関するScottGuの記事 を参照してください。これは つまり、SqlMembershipProviderの実際のソースコードをダウンロードするためのリンク を提供します。
しかし、実際に行う最も簡単なことは、ユーザーオブジェクトまたはユーティリティクラスのGetUserId()メソッドです。このメソッドでは、キャッシュ/セッションからUserIdを取得します。それ以外の場合は、データベースにアクセスし、ユーザー名でキャッシュします(またはセッションに保存します)。そしてそれを返します。
さらに考慮すべき点については(ただし、Cookieのサイズ制限があるため、十分に注意してください): フォーム認証:プロバイダーおよびセッションのないメンバーシップ、ロール、およびプロファイル
次のことを試してください。
Membership.GetUser().ProviderUserKey
public string GetUserID()
{
MembershipUser _User;
string _UserId = "";
_User = Membership.GetUser();
Guid UserId = (Guid)_User.ProviderUserKey;
return _UserId = UserId.ToString();
}
私はこの問題を抱えていました、解決策はweb.config構成にあります、これらでweb.configを構成してみてください:
<roleManager
enabled="true"
cacheRolesInCookie="true"
defaultProvider="QuickStartRoleManagerSqlProvider"
cookieName=".ASPXROLES"
cookiePath="/"
cookieTimeout="30"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
createPersistentCookie="false"
cookieProtection="All">
<providers>
<add name="QuickStartRoleManagerSqlProvider"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="ASPNETDB"
applicationName="SecurityQuickStart"/>
</providers>
</roleManager>
ここには2つのオプションがあります。
1)ユーザーデータテーブルの主キーとしてユーザー名を使用します。
select * from [dbo.User] where Username = 'andrew.myhre'
2)ユーザーIDをプロファイルに追加します。
それぞれの方法には長所と短所があります。個人的には、最初の方が好きです。これは、すぐに使用できるプロファイルプロバイダーを設定する必要がないことを意味し、とにかくシステムに一意のユーザー名を適用することを好みます。
Andrew:デフォルトで表示されているようなクエリを実行する場合は注意が必要です。それに一致するインデックスがないため、全表スキャンのリスクがあります。さらに、ユーザーデータベースを複数のアプリケーションに使用している場合は、アプリケーションIDを含めていません。
最も近いインデックスはaspnet_Users_Indexであり、ApplicationIdとLoweredUserNameが必要です。
編集:
おっと-Andrewの投稿を読み直してください。彼は、aspnet_Usersテーブルでselect *を実行していませんが、ユーザー名を主キーとして使用するカスタムプロファイル/ユーザーテーブルを実行しています。
System.Web.HttpContext.Current.User.Identity.Name
を使ってみましたか? (最初にUser
とIdentity
がnull以外であることを確認してください。)