如何在mvc中使用自定义成员身份添加更多自定义字段?

时间:2012-01-06 15:31:13

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 membership-provider

我已覆盖成员资格方法以创建自定义成员资格。

在帐户模型中,我覆盖了方法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会给我一个错误:(

4 个答案:

答案 0 :(得分:5)

您需要实施自定义成员资格用户。以下是一个示例实现:

另请看一下这个帖子:

答案 1 :(得分:1)

您可以保持AspNetUsers表不变,并创建一个新表来存储额外信息(链接到原始信息)。这样您就不会破坏成员资格提供程序中的任何现有代码。

原始的AspNetUsers表具有: [ID],[电子邮件],[EmailConfirmed],[PasswordHash],[SecurityStamp],[******中国],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount],[用户名]

用于存储额外数据的新表可以具有例如: [Id],[UserId] [DateOfBirth],[传记]等 其中[UserId]是AspNetUsers表的外键。

这种方法的一个优点是,您可以创建多种类型的用户,每种用户将相关信息存储在不同的表中,而常用数据仍在原始表中。

如何:

  1. 首先更新RegisterViewModel以包含您想要的额外数据。
  2. 更新帐户控制器中的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);
    }
    
  3. 根据需要实现AddUserProfile(int userId,RegisterViewModel模型)方法。您将从模型对象中收集额外数据以及userId,并将新配置文件对象保存在数据库中。

答案 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...
    }