如何在ASP.NET MVC 4 Simple Membership中使用“电子邮件”而不是“UserName”登录

时间:2013-11-12 15:48:13

标签: asp.net asp.net-mvc asp.net-mvc-4 membership

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

3 个答案:

答案 0 :(得分:3)

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

您可能还希望在注册用户时防止重复的电子邮件,以确保1封电子邮件返回1个帐户。以下帖子将在本次会议上提供帮助:

How does one prevent duplicate email addresses while users modify their email addresses after registration using the default MVC Membership Provider?

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

答案 1 :(得分: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; }
}

当然,电子邮件将在注册时从用户处获取,因此在RegisterModel类上进行如下更改

现在您已登录并注册已更新。然后,最终存储在数据库中的实际数据在UserProfile类中定义,所以,让我们添加和Email字段。

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

现在您已完成更新模型。但是现在这仍然有效,因为当你点击注册时,它实际上会添加userName和Password并使用该对进行身份验证。现在让我们改变它。导航到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);
    }

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

答案 2 :(得分:0)

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

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

只是为了将速度改为:

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

根据您的代码,您知道Email字段实际上是用户名,因此您无需在任何地方进行更改。