2

我正在使用带有 SimpleMembership 的 ASP.NET MVC 4。当我调用WebSecurity.UserExists()特定用户时,它返回 true。但是,给定用户存在于个人资料表中,但不存在于成员资格表中。

此函数的在线文档对这两个表有矛盾的陈述。一方面,它说

返回一个值,该值指示指定用户是否存在于成员资格数据库中。

然后后来它说

如果用户名存在于用户配置文件表中,则为 true;否则为假。

我正在维护自己的用户个人资料表,并让 SimpleMembership 构建和维护自己的成员资格表 (webpages_Membership)。有问题的用户存在于我的个人资料表中,但不在 pages_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。但是,给定用户存在于个人资料表中,但不存在于成员资格表中。

这是默认行为。你对它有什么期待?

此外,在我看来,我认为确定用户是否已使用 Membership 表注册不是一个好主意,因为 UserTable 中的每个用户在 Membership 表中都有一个关联条目(可能不一定,但在我的情况下,我可以看到)。

你不能在 UserTable 本身中有一个 IsRegistered 列来建立这个吗?

于 2013-08-06T04:26:07.637 回答
1

阅读这篇文章,了解如何使用 SimpleMembership 设置自我注册。无需检查是否添加了会员信息。而是使用WebSecurity.IsConfirmed方法来判断用户是否已完成注册。

于 2013-08-07T14:56:24.273 回答