ASP.NET Web アプリケーション プロジェクトでUserId
使用せずに ASP.NET メンバーシップにアクセスするにはどうすればよいですか?Membership.GetUser(username)
( )の隣UserId
の名前空間に含めることができますか?Profile
UserName
System.Web.Profile.ProfileBase
ASP.NET Web アプリケーション プロジェクトでUserId
使用せずに ASP.NET メンバーシップにアクセスするにはどうすればよいですか?Membership.GetUser(username)
( )の隣UserId
の名前空間に含めることができますか?Profile
UserName
System.Web.Profile.ProfileBase
UserIdが必要になるたびにデータベース呼び出しを保存する理由はありますか?その場合、ASP.NET MembershipProviderを使用しているときは、通常、その呼び出しをキャッシュできるカスタムプロバイダーか、キャッシュできるユーティリティメソッドのいずれかを実行します。
プロファイルに配置することを検討している場合、特にデータベース呼び出しが必要であり、そこでカスタムプロファイルプロバイダーを使用していない限り、追加の処理が行われるため、そうする理由はあまりわかりません。 UserIdを解析します。
なぜ彼らがGetUserIdメソッドを実装しなかったのか疑問に思っているのなら、それは単に、含まれているプロバイダーのように、そのユーザーIDがGUIDになることが常に保証されているわけではないからです。
編集:
SqlMembershipProviderなどの実際のソースコードをダウンロードするためのリンクを提供するプロバイダーに関するScottGuの記事を参照してください。
しかし、実際に行う最も簡単なことは、ユーザーオブジェクトまたはユーティリティクラスのGetUserId()メソッドです。このメソッドでは、キャッシュ/セッションからUserIdを取得します。それ以外の場合は、データベースにアクセスし、ユーザー名でキャッシュします(またはセッションに保存します)。そしてそれを返します。
さらに考慮すべき点について(ただし、Cookieのサイズ制限があるため、十分に注意してください):フォーム認証:プロバイダーおよびセッションのないメンバーシップ、ロール、およびプロファイル
ユーザーの認証を独自に作成することにしました (非常に単純ですが機能します)。これはずっと前に行う必要がありました。
私の最初の質問は UserId に関するもので、以下からは入手できません。
System.Web.HttpContext.Current.User.Identity.Name
public string GetUserID()
{
MembershipUser _User;
string _UserId = "";
_User = Membership.GetUser();
Guid UserId = (Guid)_User.ProviderUserKey;
return _UserId = UserId.ToString();
}
ここには2つのオプションがあります。
1)ユーザーデータテーブルの主キーとしてユーザー名を使用します。
select * from [dbo.User] where Username = 'andrew.myhre'
2)プロファイルにUserIDを追加します。
それぞれの方法には長所と短所があります。個人的には、最初の方が好きです。これは、すぐに使用できるプロファイルプロバイダーを設定する必要がないことを意味し、とにかくシステムに一意のユーザー名を適用することを好みます。
私はこの問題を抱えていました、解決策は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>
アンドリュー: デフォルトでは、あなたが示したようなクエリを実行することに注意してください。それに一致するインデックスがないため、テーブル全体をスキャンするリスクがあります。さらに、ユーザー データベースを複数のアプリケーションに使用している場合は、アプリケーション ID が含まれていません。
最も近いインデックスは、ApplicationId と LoweredUserName を必要とする aspnet_Users_Index です。
編集:
おっと-アンドリューの投稿を読み直してください。彼は aspnet_Users テーブルで select * を行っていませんが、ユーザー名を主キーとして使用するカスタム プロファイル/ユーザー テーブルを作成しています。
使ってみましたSystem.Web.HttpContext.Current.User.Identity.Name
か?User
(最初にandIdentity
が null でないことを確認してください。)
{
MembershipUser m = Membership.GetUser();
Response.Write("ID: " + m.ProviderUserKey.ToString());
}
aspnet_Membership テーブルから現在のユーザーの UserID (uniqueidentifier) を取得します - 現在のユーザーがログインに成功した場合。認証が成功する前に <%= %> またはその値を割り当てようとすると、「オブジェクト参照オブジェクトのインスタンスに設定されていません」。