我最近开始修改ASP.NET MVC,但这个问题也应该适用于经典的ASP.NET。对于它的价值,我不太了解表单身份验证和成员资格提供程序。
我正在尝试编写自己的MembershipProvider
,它将连接到我自己的数据库中的自定义用户表。我的用户表包含所有基本用户信息,如用户名,密码,密码盐,电子邮件地址等,还包括姓名,姓氏和居住国家等信息。
据我所知,在ASP.NET中执行此操作的标准方法是创建用户表 没有额外信息,然后是带有额外信息的“个人资料”表。但是,这对我来说听起来不是很好,因为无论何时我需要访问额外的信息,我都必须进行一次额外的数据库查询才能获得它。
我在“C#2008中的Pro ASP.NET 3.5”一书中读到,如果您需要访问配置文件表并在您的网站中有许多不同的页面,那么为配置文件提供单独的表并不是一个好主意
现在问题就在眼前......正如我所说,我正在编写自己的自定义MembershipProvider
子类,到目前为止它已经很顺利了,但现在我已经意识到{{1不允许我以我想要的方式创建用户。该方法只接受固定数量的参数,并且名字,姓氏和居住国不属于他们。
那么,如果我的CreateUser
的{{1}}中没有此信息,我将如何在自定义表格中为新用户创建条目?
答案 0 :(得分:3)
我认为你应该继续你的方法并在你的实现中添加一个新函数,我的意思是,重载CreateUser方法并将CustomMembershipUser(扩展MembershipUser)作为参数。 这样,在使用提供程序之前,将其强制转换为CustomMembershipProvider并使用重载方法。
答案 1 :(得分:2)
我同意您的分析,您应该将成员资格和个人资料信息保存在同一个表格中。由于您正确受限于CreateUser采用的参数数量,因此您需要设计字段,以便非成员资格配置文件属性可以为空。但是,这并不意味着您将在数据库中具有必需的空字段。相反,你可以在下面的片段:
string username = .../ retrieve username here
Membership.CreateUser(username , password, email);
ProfileBase newProfile = Profile.Create(username); //since the user has just been created, all properties will be blank
//set all entered properties
newProfile.SetPropertyValue("MyProp1", myProp1Value);
...
newProfile.SetPropertyValue("MyPropN", myPropNValue);
newProfile.Save();
通过这种方式,您可以利用ASP.NET的成员资格提供程序来创建用户并保存配置文件数据,但对于最终用户来说,这是一个单一的原子操作。