2013-08-05 624 views
2

我在SimpleMembership中使用ASP.NET MVC 4。当我为特定用户拨打WebSecurity.UserExists()时,它将返回true。但是,给定用户存在于配置文件表中,但不存在于成员资格表中。WebSecurity.UserExists()返回错误的值

此功能的在线文档与2表有矛盾的说法。一方面,它说

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

如果在用户配置表中存在的用户名再后来它说

真实的;否则,是错误的。

我维护我自己的用户档案表,让SimpleMembership建立和维护自己的会员表(webpages_Membership)。有问题的用户存在于我的个人资料表中,但不存在于网页会员中。

我想让用户自行注册,但只允许在个人资料表中有记录的人这样做。因此,此用户存在于配置文件表中,但尚未注册。当用户尝试注册时,我希望能够检查他们是否在配置文件表中有记录,但是此功能没有达到我期望的效果。而且,更麻烦的是,文档不清楚它是否检查配置文件表或会员表。

+1

想想也许你可以把它分成更短的段落,这样它更容易阅读? – Amy

+1

除了@Amy在说什么之外,您应该也可以添加一些代码示例,因为样本比长段落更容易阅读/理解。 – SOfanatic

+0

我试图让帖子更具可读性,但你应该按照这里的建议,并添加一个代码片段,显示什么是不像你期望的那样工作。 – jadarnel27

回答

1

纵观WebSecurity和SimpleMembershipProvider代码,我可以证实,它会检查就能从UserTable也就是说,我们在调用InitializeDatabase指定表名的用户,如下图所示:

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

所以在这种情况下,它会检查用户配置表中,当你拨打电话

WebSecurity.UserExists(userName); 

它传播到你已经在初始化的时间关联的的MembershipProvider,在MVC4默认为

SimpleMembershipProvider

所以它去SimpleMembershipProvider.GetUser(),而且它会检查这样的:

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

这清楚地表明它在user表中,而不是在成员表检查。

我看到你的困惑,当他们说会员数据库时,他们指的是你保存用户数据的数据存储,而不是会员表。

我不明白是什么问题,其实,你只说:

当我打电话WebSecurity.UserExists()为特定用户,它返回true。但是,给定用户存在于配置文件表中,但不存在于成员资格表中。

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

另外在我看来,我不认为它是一个好主意,以确定用户是否注册或不使用成员表作为UserTable中的每个用户在成员表中有一个关联的条目(可能不一定,但在我的情况我理解了)。

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

+0

目前这也让我感到困惑,但我认为你已经回答了OP的问题,这应该被接受。 – Michael12345