我正在使用 ASP.NET MVC 4 开发一个入门级应用程序。该应用程序将有一个会员系统。我想使用集成的 SimpleMembershipProvider,因为创建一个新的对我来说会很复杂。因此,用户必须使用他们的电子邮件地址而不是 SimpleMembershipProvider 中的用户名登录应用程序。但我无法做出这种改变。这样做的唯一方法是创建我自己的会员提供商吗?
3 回答
使用电子邮件查找用户的 ID。将该用户传递给成员资格并使用该用户对用户进行身份验证。
您可能还希望在注册用户时防止重复电子邮件,以确保 1 封电子邮件返回 1 个帐户。以下帖子将对此情景有所帮助:
当用户在注册后使用默认的 MVC Membership Provider 修改他们的电子邮件地址时,如何防止重复的电子邮件地址?
您也可以在表格中为电子邮件创建一个唯一键,以确保不会注册重复的电子邮件。
在 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);
}
这应该允许您使用电子邮件和密码作为登录对。
一个简单的选择:在文件 Models/AccountViewModels.cs 中,您会发现许多包含如下字段的类:
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
只是为了速度将它们更改为:
[Required]
[Display(Name = "Username")]
public string Email { get; set; }
从您的代码中您知道该Email
字段实际上是用户名,因此您不必到处更改。