2

ASP.NETMVCの学習を始めたばかりです。デフォルトでを使用する標準のプロジェクトテンプレートで作成されたプロジェクトに取り組んでいますSqlMembershipProvider。これにより、メンバーシップ情報を保持するために、プロジェクトにASPNETDB.mdfデータベースが自動的に作成されました。このデータベースに保存されているメンバーを実際のアプリケーションデータに関連付けるにはどうすればよいですか?

this.User.Identity.Nameアプリケーションのデータベースとの間でユーザー固有の情報を保存または取得するときにキーとして使用するために、アクションメソッドで現在のユーザーの名前を参照するだけでよいですか?または、this.User.Identity.UserId代わりに使用する必要がありますか?整数ベースのIDは、文字列またはGUIDベースIDよりも検索がはるかに高速であると常に思っていました。ただし、aspnet_Usersテーブルの主キーはGUIDフィールドです。

との間に違いはありますthis.userthis.HttpContext.UserIPrincipalこれらのプロパティからの戻り値とからの戻り値MembershipUserについてはどうでしょうかMembership.GetUser()。これらの違いは何ですか?

また、メンバーシップ情報をアプリケーションデータベースとは別のデータベースに保持するのが最善ですか?それとも、それらを1つのデータベースにマージしても大丈夫ですか?

4

3 に答える 3

1

デフォルトのテンプレートでは、Modelsフォルダーに「AccountModel」があり、formsauthentication/membership関数の一部のラッパーが作成されます。これを拡張して、現在のHttpContextに格納されているIPrincipalである現在の「HttpContext.Current.User」を返す関数を追加できます。そこからNameプロパティを使用すると、ユーザー名でメンバーシップをクエリしてメンバーシップデータを取得できます(IPrincipalは、ユーザー名、ロールなどの非常に基本的なものを格納するだけで、MembershipUserはデータベースから取得した他のすべてのデータを保持します)。

SqlMembershipProviderは、かなりくだらないimoであり、小さなプロジェクト以外では制限があります...同時に、複雑になります。私は現在2000以上のアカウントを持つサイトでそれを使用しています、そしてあなたが何かをカスタマイズしたいならそれはピタです。formsauthenticationを使用して独自のフォームを作成し、メンバーシップのがらくたを取り除くだけでよい(そしてネット上には多くの例があります)。私は今それを持っています私は私が最初にそれを書いたことを望みます。

于 2011-04-18T20:21:54.197 に答える
1

あなたの質問にはいくつかの要素があります、いくつかのポイント:

私は通常、ID名を使用します。これは、通常、ID名を使用する方が効率的だからです。get user関数は、データベースから完全なユーザーデータを取得し、最終アクセス時刻を更新します。IPrincipleはこれを必要とせず、メモリデータで使用します。そのため、usernameプロパティはより速く、より簡単に利用できます。主な注意点は、ユーザーがユーザー名を変更できるようにする場合です。その場合、IDの方が意味があります。

ユーザー関連のレコードがたくさんあることを考慮しているようです。あなたは正しいです、整数は調べるのが最も速いです。大量のデータがある場合は、メンバーシッププロバイダーを拡張するか、マッピングテーブルを追加することにより、ユーザーを整数にマップすることをお勧めします。

this.UserとHttpContext.Userについては、違いはありません。

于 2011-04-18T20:51:41.060 に答える
0

SqlMembershipProviderを使用したアプリでは、通常、そのテーブル/ sprocをアプリケーションテーブルと同じDBに保存し、外部キーを使用してアプリテーブルをユーザーテーブルにリンクしました。私がこの方法でやっていないのは、1つのユーザーデータベースが、それぞれが独自のアプリデータベースを持つ複数の異なるアプリケーション間で共有される場合でした。

于 2011-04-18T20:23:05.940 に答える