Asp.net 以电子邮件作为登录名的Profilesystem/Membershipsystem

Asp.net 以电子邮件作为登录名的Profilesystem/Membershipsystem,asp.net,asp.net-membership,asp.net-profiles,Asp.net,Asp.net Membership,Asp.net Profiles,ASP.NET成员身份系统使用唯一的用户名来标识用户。如果我需要通过电子邮件登录用户怎么办 我可以将电子邮件传递到用户名的属性中,但随后事情变得有点混乱。用户可能希望更改电子邮件地址 是否有任何可用的资源描述了一种实现它的好方法?您使用电子邮件地址作为用户名的方法对我很有效。但你是对的;当电子邮件地址被更改时,它确实会变得混乱。我们采取的方法是,当用户希望更改其电子邮件地址时,我们也会更改其用户名。做到这一点的唯一方法是通过直接的数据库操作。我们小心地确保对用户的任何引用都是通过UserId完成

ASP.NET成员身份系统使用唯一的用户名来标识用户。如果我需要通过电子邮件登录用户怎么办

我可以将电子邮件传递到用户名的属性中,但随后事情变得有点混乱。用户可能希望更改电子邮件地址


是否有任何可用的资源描述了一种实现它的好方法?

您使用电子邮件地址作为用户名的方法对我很有效。但你是对的;当电子邮件地址被更改时,它确实会变得混乱。我们采取的方法是,当用户希望更改其电子邮件地址时,我们也会更改其用户名。做到这一点的唯一方法是通过直接的数据库操作。我们小心地确保对用户的任何引用都是通过UserId完成的;这确保了用户名更改不会破坏任何内容

这是我们使用的代码,以防您感兴趣。代码位于一个持久类中,该类包装了MembershipUser类,并以一对一的关系存储。只要忽略邪恶的SQL字符串构建,做一些更好的事情;)

IDbCommand cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Format(
    "UPDATE dbo.aspnet_Users SET UserName = '{0}', LoweredUserName = '{0}' WHERE UserId = '{1}'",
    DatabaseManager.SqlEscape(value.ToLower()), this.Id);
cmd.ExecuteNonQuery();

cmd = connection.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Format(
    "UPDATE dbo.aspnet_Membership SET Email = '{0}', LoweredEmail = '{0}' WHERE UserId = '{1}'",
    DatabaseManager.SqlEscape(value.ToLower()), this.Id);
cmd.ExecuteNonQuery();