我已覆盖成员资格方法以创建自定义成员资格。
在帐户模型中,我覆盖了方法CreateUser
:
public override MembershipUser CreateUser(string username, string password,
string email, string passwordQuestion, string passwordAnswer,
bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(
username, password, true);
OnValidatingPassword(args);
if (args.Cancel)
{
status = MembershipCreateStatus.InvalidPassword;
return null;
}
if (RequiresUniqueEmail && GetUserNameByEmail(email) != "")
{
status = MembershipCreateStatus.DuplicateEmail;
return null;
}
MembershipUser u = GetUser(username, false);
if (u == null)
{
UserRepository _user = new UserRepository();
// Here I call my new method which has fields I've created in the
// User table; I'm using entity framework.
_user.CreateUser(username, password, email);
status = MembershipCreateStatus.Success;
return GetUser(username, false);
}
else
{
status = MembershipCreateStatus.DuplicateUserName;
}
return null;
}
public MembershipUser CreateUser(string username, string password,
string email)
{
using (CustomMembershipDB db = new CustomMembershipDB())
{
User user = new User();
user.UserName = username;
user.Email = email;
user.PasswordSalt = CreateSalt();
user.Password = CreatePasswordHash(password, user.PasswordSalt);
user.CreatedDate = DateTime.Now;
user.IsActivated = false;
user.IsLockedOut = false;
user.LastLockedOutDate = DateTime.Now;
user.LastLoginDate = DateTime.Now;
//Generate an email key
// user.NewEmailKey = GenerateKey();
db.AddToUsers(user);
db.SaveChanges();
//send mail
// SendMail(user);
return GetUser(username);
}
}
现在我需要添加更多两个字段,如名字和姓氏,但是如何将其传递给上述方法?
如果我在其中添加诸如名字和姓氏之类的参数,覆盖方法CreateUser
会给我一个错误:(
答案 0 :(得分:5)
您需要实施自定义成员资格用户。以下是一个示例实现:
另请看一下这个帖子:
答案 1 :(得分:1)
您可以保持AspNetUsers表不变,并创建一个新表来存储额外信息(链接到原始信息)。这样您就不会破坏成员资格提供程序中的任何现有代码。
原始的AspNetUsers表具有: [ID],[电子邮件],[EmailConfirmed],[PasswordHash],[SecurityStamp],[******中国],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount],[用户名]
用于存储额外数据的新表可以具有例如: [Id],[UserId] [DateOfBirth],[传记]等 其中[UserId]是AspNetUsers表的外键。
这种方法的一个优点是,您可以创建多种类型的用户,每种用户将相关信息存储在不同的表中,而常用数据仍在原始表中。
如何:
更新帐户控制器中的Register方法,这是使用代码更新的原始方法,以插入新的配置文件数据:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
// Start of new code ----------------------------------------
// Get Id of newly inserted user
int userId = user.Id; // Get Id of newly inserted user
// Create a profile referencing the userId
AddUserProfile(userId, model);
// End of new code ----------------------------------------
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
return View(model);
}
答案 2 :(得分:0)
创建一个继承自MembershipProvider的类,并通过调用SqlMembershipProvider实现相同的方法,但更改其他需要不同功能的方法。
看一下这篇文章SQLite 3.0 Membership and Role Provider for ASP.NET 2.0
<强>更新强>
ASP.NET中的Membership系统旨在创建标准化的 用于处理用户帐户的API,这是许多Web面临的任务 应用程序(请参阅本系列文章的第1部分以获取更多信息 深入了解会员资格)。虽然会员制度包含在内 核心用户相关属性 - 用户名,密码,电子邮件地址和 等等 - 通常需要捕获额外的信息 每个用户。不幸的是,这些附加信息可能不同 从应用程序到应用程序。
不是向会员系统添加其他用户属性, Microsoft改为创建了Profile系统来处理其他用户 属性。 Profile系统允许附加的,特定于用户的 要在Web.config文件中定义的属性并负责 将这些值保存到某个数据存储区。
参考:Examining ASP.NET's Membership, Roles, and Profile - Part 6
答案 3 :(得分:0)
这就是我完成这样的事情的方式。我向CreateUserWizard添加了事件onCreatedUser
,当您按下CreateUser
按钮时,它会加载方法
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
MembershipUser mu = Membership.GetUser(CreateUserWizard1.UserName);
int idOfInsertedUser = (int)mu.ProviderUserKey;
TextBox tb1 = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("FirstName";
string firstName= tb1.Text;
TextBox tb2 = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("LastName";
string lastName= tb2.Text;
// now you have values of two more fields, and it is time to call your Database methods for inserting them in tables of choice...
}