我正在开发一个 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 有其他一些(更好的?)方法,而我所做的就是在工作中投入一把扳手?