在ASP.NET Forms身份验证中使用电子邮件地址而不是username

时间:2011-01-14 16:51:39

标签: asp.net-mvc asp.net-membership forms-authentication

我正在使用内置的“Internet应用程序”模板启动一个全新的ASP.NET MVC应用程序。

如何设置它以允许使用电子邮件地址&密码而不是用户名&密码?

3 个答案:

答案 0 :(得分:1)

如果您使用的是默认AccountModels,您可以更改LogOnModel以删除UserName并添加Email,如下所示:

public class LogOnModel {
    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    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; }
}

同时在UserName视图中将Email的出现次数更改为LogOn

最后在您的AccountController中,更改LogOn操作以从电子邮件地址获取UserName以完成SignIn流程,如下所示:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl) {
  if (ModelState.IsValid) {
    var userName = Membership.GetUserNameByEmail(model.Email);
    if (MembershipService.ValidateUser(userName, model.Password)) {
      FormsService.SignIn(userName, model.RememberMe);
      if (Url.IsLocalUrl(returnUrl)) {
        return Redirect(returnUrl);
      } else {
        return RedirectToAction("Index", "Home");
      }
    } else {
      ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }
  }

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

答案 1 :(得分:1)

我们有同样的要求并且这样做, 你应该创建自定义标识(CustomIdentity:IIdentity,ISerializable)

[Serializable]
public class CustomIdentity : IIdentity, ISerializable

并为其定义Name属性。

然后获取名称属性的get方法返回用户的电子邮件

    public string Name 
    { 
        get{ return Email; }
    }

如果需要详细信息,请对此帖发表评论

答案 2 :(得分:0)

解决方案不像使用名称字段作为电子邮件地址那么简单吗?