Simplemembership - 添加电子邮件字段并用作登录名

时间:2013-05-13 19:13:42

标签: asp.net sql asp.net-mvc-4 visual-studio-2012 simplemembership

我想在这里做两件事:

1。将电子邮件字段添加到(默认)UserProfile表。 奇迹般有效。 用户可以注册用户名和电子邮件。

2。更改登录信息以使用电子邮件而不是用户名,这也像魅力一样。

这是问题所在。只有在我使用它们注册过程失败并且以下错误消息

时,上述内容才有效。
Cannot insert the value NULL into column 'UserName', table 'opdb.dbo.UserProfile'; column does not allow nulls. INSERT fails.

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email 
}); 
WebSecurity.Login(model.Email, model.Password);

我或多或少跟随着 guide found here, 在评论部分,我看到其他人遇到了同样的问题,但是,解决方法是不要将UserName字段设置为允许回复中所述的空值。

奇怪的是,只要我不同时使用它们,一切都会有效。有任何想法吗?这让我抓狂!

提前致谢

修改:它可能是数据库中列的顺序吗?用于识别的字段需要是表格中的第一列吗?那么,如果我想将电子邮件作为身份,需要成为表格中的第一列?

2 个答案:

答案 0 :(得分:5)

这不是列顺序。我认为您没有正确设置WebSecurity.InitializeDatabaseConnection。这听起来像是在添加电子邮件字段时,它被视为电子邮件字段(而不是用户的自然键),当您更改登录以使用电子邮件时,您实际上是将电子邮件插入UserName列?

无论哪种方式,工作都很简单。假设您已在数据库中拥有电子邮件列,并且使用的是标准Internet应用程序模板,请执行以下操作:

  1. 更改您的UserProfile模型以添加Email属性,对RegisterModel执行相同操作,并将Login模型从UserName更改为{{1 }}
  2. 更新Email以使用电子邮件而不是InitializeSimpleMembershipAttribute作为用户的自然密钥
  3. 更新UserName AccountControllerLogin操作,以便在注册时捕获用户名和电子邮件,并在登录时使用电子邮件
  4. 更新视图
  5. 所以,实际的变化是:

    • Models / AccountModels.cs更改
      • Register:添加属性class UserProfile
      • public string Email { get; set; }:将属性名称从class LoginModel更改为UserName
      • Email:添加属性class RegisterModel并将其属性设置为public string Email { get; set; },设置Required等。(如果您想要强制执行此操作,还需要最大长度
    • Display(Name更改
      • AccountController方法:
        • Login
        • 行中将model.UserName更改为model.Email
      • if (ModelState.IsValid && WebSecurity.Login(model.UserName ...方法:
        • Register更改为WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
        • 编辑 - 错过了更改:WebSecurity.CreateUserAndAccount(model.Email, model.Password, new { UserName = model.UserName });更改为WebSecurity.Login(model.UserName, model.Password);
    • 过滤器/ InitializeSimpleMembershipAttribute.cs更改
      • WebSecurity.Login(model.Email, model.Password);
      • 中将"UserName"更改为"Email"
    • 查看/帐户/ Login.cshtml
      • WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);的三种用法更改为m.UserName
    • 查看/帐户/ Register.cshtml
      • 复制并粘贴UserName m.Email部分,并将重复项<li>更改为m.UserName

    在一个vanilla Internet Application MVC 4项目中,这些更改将完美运行(如果您想要使用这些更改,并且您没有编辑数据库以添加“电子邮件”列,则可能必须应用迁移)。

答案 1 :(得分:2)

我不确定Andy Browns的建议是否有效,因为名称空间WebMatrix.WebData引用中的WebSecurity将无法正常工作。他们专门查看UserName字段以执行其操作。我错了,但这是我的看法。如果您想要一个单独的字段,请创建另一个用户名字段(名称)并运行您自己的代码以更新该字段以反映给用户。

我选择设置一个注册视图,将UserName重命名为User Email

<li>
@Html.Label("Email Address:")
@Html.TextBoxFor(m => m.UserName)
</li>

然后在登录和注册模型中,只需要输入用户名作为电子邮件格式:

[Required]
[DataType(DataType.EmailAddress)]
[EmailAddress]
[Display(Name = "UserEmail")]
public string UserName { get; set; } 

可能过于简单,但它对我有用。