我正在使用ASP.NET MVC 4开发入门级应用程序。该应用程序将具有会员系统。我想使用集成的SimpleMembershipProvider,因为创建一个新的将对我来说很复杂。因此,用户必须使用电子邮件地址而不是SimpleMembershipProvider中的用户名登录应用程序。但我无法做出这种改变。唯一的方法是创建我自己的会员提供者吗?
答案 0 :(得分:3)
使用电子邮件查找用户的ID。将该用户传递给成员资格并使用该用户进行身份验证。
您可能还希望在注册用户时防止重复的电子邮件,以确保1封电子邮件返回1个帐户。以下帖子将在本次会议上提供帮助:
您也可以在表格中为电子邮件创建一个唯一的密钥,以确保不会注册重复的电子邮件。
答案 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
字段实际上是用户名,因此您无需在任何地方进行更改。