我总是使用自己的代码来创建登录和注册,但使用成员资格可以节省我在以下项目中编程这些东西的大量时间。
现在我发现了很多关于实现自己的自定义成员资格的教程,其中一些与其他成员有所不同。我很难理解实现简单的自定义成员资格实施的最佳解决方案。
对于这个项目,我只需要添加一些额外的用户信息,如街道名称,邮政编码等。
我目前所做的是:
public class CustomMembershipUser : MembershipUser
{
public CustomMembershipUser(
string providerName,
string name,
object providerUserKey,
string email,
string passwordQuestion,
string comment,
bool isApproved,
bool isLockedOut,
DateTime creationDate,
DateTime lastLoginDate,
DateTime lastActivityDate,
DateTime lastPasswordChangedDate,
DateTime lastLockoutDate
)
: base(providerName, name, providerUserKey, email, passwordQuestion,
comment, isApproved, isLockedOut, creationDate, lastLoginDate,
lastActivityDate, lastPasswordChangedDate, lastLockoutDate)
{
}
// Add additional properties
public string Streetname { get; set; }
public string Postcode { get; set; }
}
public abstract class CustomMembershipProvider : MembershipProvider
{
public override MembershipUser GetUser(string username, bool userIsOnline)
{
// get data logic
var user = new CustomMembershipUser(
"CustomMembershipProvider",
"naam",
"1",
"adasd@live.com",
"",
"",
true,
false,
DateTime.Now,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue) { Streetname = "Test", Postcode = "Test2"};
return user;
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer,
bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
var user = new CustomMembershipUser(
"CustomMembershipProvider",
"naam",
"1",
"adasd@live.com",
"",
"",
true,
false,
DateTime.Now,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue,
DateTime.MinValue) { Streetname = "Test", Postcode = "Test2" };
status = MembershipCreateStatus.Success;
return user;
}
}
这是我的自定义会员资格的最佳解决方案还是有更好的选择?
我还没有测试过,所以我不知道这是否有效。
我正在使用MVC 4.
答案 0 :(得分:1)
我建议使用ASP.NET身份:http://www.asp.net/identity
在IdentityUser
收集的内容之上添加其他数据相对容易。这是默认的用户表:
要在此基础上添加数据,您只需继承IdentityUser
:
public class AppUser : IdentityUser
{
// Add additional properties
public string Streetname { get; set; }
public string Postcode { get; set; }
}
您可以根据需要添加其他字段,但据我所知,MembershipProvider
是一个过时的系统来处理身份验证,因为ASP.NET身份更加灵活和开放。 / p>
我还建议将所有额外字段偏移到Profile
类 - 只是我发现要好得多的东西 - 用所有这些不同字段填充配置文件表而不是用户表 - 但我认为这取决于个人偏好。
答案 1 :(得分:1)
首先要了解的是会员资格,它与名称,地址等无关......它严格来说是用户名,用户名,密码和身份验证。而已。不要试图扩展它来添加名称和地址,这不是它的用途。
相反,您只需创建自己的“UserProfile”表或任何您想要调用它的表。此表应键入成员资格提供程序提供的ProviderUserKey。然后,您只需要在UserProfile表中查找所需的任何数据,而无需修改与Membership相关的任何内容。
因此,在您的情况下,您可以使用标准成员资格提供程序,该成员资格提供程序键入GUID。然后创建一个名为UserProfile的表,该表有3列。 UserId(uniqueidentifier),StreetName和PostalCode。
在您的应用程序中,您调用Membership.GetUser()。ProviderUserKey并将其用作在UserProfile表中查找数据的键。这很快,很简单,并且不需要对成员资格进行自定义修改。
在您的AccountController.Register方法中,您可以在创建成员资格用户之后,还创建一个UserProfile记录,其中包含用户ProviderUserKey以及您想要存储的信息。