首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在UserName MVC 4简单成员中使用“电子邮件”而不是"UserName“登录

如何在UserName MVC 4简单成员中使用“电子邮件”而不是"UserName“登录
EN

Stack Overflow用户
提问于 2013-11-12 15:48:12
回答 3查看 3.9K关注 0票数 1

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-12 16:01:25

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

您也可能希望在注册用户时防止重复的电子邮件,以确保1封电子邮件返回一个帐户。下面这篇文章将对此有所帮助:

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

此外,您可以在表中为电子邮件创建一个唯一的键,以确保没有重复的电子邮件将被注册。

票数 3
EN

Stack Overflow用户

发布于 2014-01-26 10:13:50

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

代码语言:javascript
复制
 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类更改如下

代码语言:javascript
复制
    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类中,因此,让我们向其中添加和发送电子邮件字段。

代码语言:javascript
复制
    [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和密码,并使用这对进行身份验证。现在让我们改变它。导航到Controllers.AccountController.cs并找到以下函数并更新它。WebSecurity.CreateUserAndAccount(model.Email,model.Password);WebSecurity.Login(model.Email,model.Password);

代码语言:javascript
复制
//
    // 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);
    }

最后,将Login操作更改如下。

代码语言:javascript
复制
        //
    // 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
EN

Stack Overflow用户

发布于 2015-07-13 08:34:38

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

代码语言:javascript
复制
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }

只是为了速度,把它们改成:

代码语言:javascript
复制
[Required]
[Display(Name = "Username")]
public string Email { get; set; }

从您的代码中可以了解到,Email字段实际上是用户名,因此您不必在任何地方更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19933629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档