2

SimpleMembership で ASP.NET MVC 4 を使用しています。特定のユーザーを呼び出すWebSecurity.UserExists()と、true が返されます。ただし、指定されたユーザーはプロファイル テーブルには存在しますが、メンバーシップ テーブルには存在しません。

この関数のオンライン ドキュメントには、2 つのテーブルに関する矛盾する記述があります。一方で、それは言う

指定されたユーザーがメンバーシップ データベースに存在するかどうかを示す値を返します。

その後、それは言う

ユーザー プロファイル テーブルにユーザー名が存在する場合は true 。それ以外の場合は false。

私は自分のユーザー プロファイル テーブルを維持しており、SimpleMembership に独自のメンバーシップ テーブル (webpages_Membership) を作成して維持させています。問題のユーザーはプロファイル テーブルに存在しますが、webpages_Membership には存在しません。

ユーザーに自己登録してもらいたいのですが、プロファイル テーブルにレコードがある人だけが登録できるようにします。したがって、このユーザーはプロファイル テーブルに存在しますが、まだ登録されていません。ユーザーが登録しようとしたときに、プロファイル テーブルにレコードがあることを確認できるようにしたいのですが、この関数は期待どおりの動作をしていません。さらに困ったことに、プロファイル テーブルとメンバーシップ テーブルのどちらをチェックするかについて、ドキュメントが不明確です。

4

2 に答える 2

1

WebSecurity と SimpleMembershipProvider コードを見ると、UserTable からユーザーをチェックしていることを確認できます。つまり、以下に示すように、InitializeDatabase の呼び出しでテーブル名を指定します。

WebSecurity.InitializeDatabaseConnection("MyDbContext", "UserProfile", "UserId",
                                "UserName", true);

したがって、この場合、電話をかけるときに UserProfile テーブルをチェックします。

WebSecurity.UserExists(userName);

初期化時に関連付けた MembershipProvider に移動します。MVC4 のデフォルトは

SimpleMembershipProvider

したがって、SimpleMembershipProvider.GetUser() に移動し、そこで次のようにチェックします。

SimpleMembershipProvider.GetUserId(database, this.SafeUserTableName, this.SafeUserNameColumn, this.SafeUserIdColumn, username);

これは、メンバーシップテーブルではなく、ユーザーテーブルでチェックしていることを明確に示しています。

彼らがメンバーシップデータベースと言うとき、彼らはメンバーシップテーブルではなく、ユーザーデータを保持するデータストアを参照しています。

あなただけが言ったように、私は実際に問題が何であるかわかりません:

特定のユーザーに対して WebSecurity.UserExists() を呼び出すと、true が返されます。ただし、指定されたユーザーはプロファイル テーブルには存在しますが、メンバーシップ テーブルには存在しません。

これはデフォルトの動作です。あなたはそれに何を期待していますか?

さらに、私の意見では、UserTable の各ユーザーは Membership テーブルに関連付けられたエントリを持っているため、ユーザーが登録されているかどうかを確認するのは良い考えではないと思います (必ずしもそうではないかもしれませんが、私の場合はそれを見ることができます)。

これを確立するために、UserTable 自体に IsRegistered 列を作成できませんか?

于 2013-08-06T04:26:07.637 に答える