2

我正在开发一个 MVC 4 应用程序。我正在研究会员身份验证和个人资料模块,我有点困惑。

我很困惑,因为似乎有两组授权/配置文件模块在幕后工作:

简洁版本

有两组授权表:一组是在您创建新的 MVC 4 Internet 应用程序时创建的,第二组是在您运行 aspnet_regsql 时创建的。数据以一种令人困惑的方式从两组中保存和提取。

这两个集合有什么关系:什么保存在哪里?为什么要在两组中创建用户?等等

长版

设置 1

我创建了一个新的 MVC 4 Internet 项目。它具有注册用户和创建角色的能力。自动生成的数据库包含以下表格:Users、Roles、UserInRoles、Memebership、Profiles。没有存储过程。授权工作正常:用户数据和角色已正确保存在用户、角色和 UserInRoles 表中。

设置 2

然后我继续为站点用户添加配置文件。我跟着乔尔的回答。运行代码时点击这一行:AccountProfile.CurrentUser.FullName = "Snoopy"; 我收到了这个错误:

找不到存储过程“dbo.aspnet_CheckSchemaVersion”。

我针对之前创建的数据库运行了 aspnet_regsql,并创建了预期的一组 aspnet_ 表和存储过程。再次测试了我的代码。这次它工作正常,并且配置文件属性被保存到 aspnet_Profile 表中(这是意料之中的)。

在下一步中,我创建了一个新用户。用户是在两个用户和 aspnet_Users 表中创建的(具有不同的 UserId 值)——请参见此处的图片 1

将属性 FullName=Snoopy 添加到他的个人资料中。

运行 Membership.GetUser().ProviderUserKey 从表 Users 中返回 UserId。运行 AccountProfile.CurrentUser.FullName 返回“史努比”。请看这里的图2

这非常令人惊讶,因为这意味着系统以某种方式知道如何将表 Users 中的记录与表 aspnet_Profile 中的记录相关联,其中 UserId 字段来自表 aspnet_users。顺便说一句,我验证了表 Profiles 是空的,因此没有从那里获取值。

那么这里发生了什么?这种行为是预期的行为吗?或者 Jole 的回答是错误的,因为在 MVC 4 应用程序中实现 Profile 有其他一些(更好的?)方法,而我所做的就是在工作中投入一把扳手?

4

1 回答 1

4

您可能应该使用其中一种。这是帮助您决定的最新帖子: http ://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4 -5-web-forms-and-asp-net-mvc-4-templates.aspx

于 2012-09-13T08:35:14.893 回答