WebSecurity.UserExists()返回错误的值

时间:2013-08-05 14:24:35

标签: asp.net asp.net-mvc-4 simplemembership

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

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

  

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

然后它说

  

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

我正在维护自己的用户个人资料表,并让SimpleMembership构建并维护自己的成员资格表(webpages_Membership)。有问题的用户存在于我的个人资料表中,但不在webpages_Membership中。

我希望用户自行注册,但只允许在配置文件表中有记录的人这样做。因此,此用户存在于配置文件表中,但尚未注册。当用户尝试注册时,我希望能够检查他们在配置文件表中是否有记录,但是这个功能没有按照我的预期进行。而且,更令人不安的是,文档不清楚是否检查配置文件表或成员资格表。

2 个答案:

答案 0 :(得分: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列来建立它吗?

答案 1 :(得分:1)

阅读how to setup self-registration using SimpleMembership上的这篇文章。无需检查是否已添加成员资格信息。而是使用WebSecurity.IsConfirmed方法来判断用户是否已完成注册。