1

我正在使用 ASP.NET MVC 4 开发一个入门级应用程序。该应用程序将有一个会员系统。我想使用集成的 SimpleMembershipProvider,因为创建一个新的对我来说会很复杂。因此,用户必须使用他们的电子邮件地址而不是 SimpleMembershipProvider 中的用户名登录应用程序。但我无法做出这种改变。这样做的唯一方法是创建我自己的会员提供商吗?

4

3 回答 3

3

使用电子邮件查找用户的 ID。将该用户传递给成员资格并使用该用户对用户进行身份验证。

您可能还希望在注册用户时防止重复电子邮件,以确保 1 封电子邮件返回 1 个帐户。以下帖子将对此情景有所帮助:

当用户在注册后使用默认的 MVC Membership Provider 修改他们的电子邮件地址时,如何防止重复的电子邮件地址?

您也可以在表格中为电子邮件创建一个唯一键,以确保不会注册重复的电子邮件。

于 2013-11-12T16:01:25.803 回答
2

在 AccountModels 类( Models.AccountModels )中,您必须更新字段,即引入电子邮件属性,如下所示

 public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    // Make change here 
    [Required]
    [Display(Name = "Your Email")]
    public string  Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

在我们收到电子邮件之后,然后在登录视图中使用电子邮件,首先将 LoginModel 类更改为如下

    public class LoginModel
{
    [Required]
    [Display(Name = "Your Email")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

当然,Email 会在用户注册时从用户那里获取,因此在 RegisterModel 类上进行如下更改

现在您已经登录并更新了注册。然后最终将存储在数据库中的实际数据在 UserProfile 类中定义,因此,让我们添加和电子邮件字段。

    [Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email  { get; set; }
}

现在您已完成模型的更新。但这现在还可以工作,因为当您单击注册时,它实际上会添加用户名和密码并使用这对进行身份验证。现在让我们改变它。导航到 Controllers.AccountController.cs 并找到以下函数并更新它。 WebSecurity.CreateUserAndAccount(model.Email, model.Password); WebSecurity.Login(model.Email, model.Password);

//
    // POST: /Account/Register

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            try
            {
                WebSecurity.CreateUserAndAccount(model.Email, model.Password);
                WebSecurity.Login(model.Email, model.Password);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

最后,当然,将登录操作更改如下。

        //
    // POST: /Account/Login

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.Email, model.Password, persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The Email or password provided is incorrect.");
        return View(model);
    }

这应该允许您使用电子邮件和密码作为登录对。

于 2014-01-26T10:13:50.023 回答
0

一个简单的选择:在文件 Models/AccountViewModels.cs 中,您会发现许多包含如下字段的类:

[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }

只是为了速度将它们更改为:

[Required]
[Display(Name = "Username")]
public string Email { get; set; }

从您的代码中您知道该Email字段实际上是用户名,因此您不必到处更改。

于 2015-07-13T08:34:38.710 回答