Is it possible to change the username with the Membership API Is it possible to change the username with the Membership API asp.net asp.net

Is it possible to change the username with the Membership API


It's true that the default SQL Membership Provider does not allow username changes. However, there's no intrinsic reason to prevent users from changing their usernames if you have a valid argument, on your site, to allow it. None of the tables in the SQL database have the username as a key, everything is based on the user's ID, so from an implementation perspective it would be fairly easy.


If you use SqlMembershipProvider, you can extend it - it also relates to this question.
Roadkill is a wiki engine not a description of my coding style.

using System;using System.Web.Security;using System.Configuration;using System.Data.SqlClient;using System.Data;using System.Web.Configuration;namespace Roadkill.Core{    public class RoadkillMembershipProvider : SqlMembershipProvider    {        private string _connectionString;        protected string ConnectionString        {            get            {                if (string.IsNullOrWhiteSpace(_connectionString))                {                    Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");                    MembershipSection section = config.SectionGroups["system.web"].Sections["membership"] as MembershipSection;                    string defaultProvider = section.DefaultProvider;                    string connstringName = section.Providers[defaultProvider].ElementInformation.Properties["connectionStringName"].Value.ToString();                    _connectionString = config.ConnectionStrings.ConnectionStrings[connstringName].ConnectionString;                }                return _connectionString;            }        }        public bool ChangeUsername(string oldUsername, string newUsername)        {            if (string.IsNullOrWhiteSpace(oldUsername))                throw new ArgumentNullException("oldUsername cannot be null or empty");            if (string.IsNullOrWhiteSpace(newUsername))                throw new ArgumentNullException("newUsername cannot be null or empty");            if (oldUsername == newUsername)                return true;            using (SqlConnection connection = new SqlConnection(ConnectionString))            {                connection.Open();                using (SqlCommand command = connection.CreateCommand())                {                    command.CommandText = "UPDATE aspnet_Users SET UserName=@NewUsername,LoweredUserName=@LoweredNewUsername WHERE UserName=@OldUsername";                    SqlParameter parameter = new SqlParameter("@OldUsername", SqlDbType.VarChar);                    parameter.Value = oldUsername;                    command.Parameters.Add(parameter);                    parameter = new SqlParameter("@NewUsername", SqlDbType.VarChar);                    parameter.Value = newUsername;                    command.Parameters.Add(parameter);                    parameter = new SqlParameter("@LoweredNewUsername", SqlDbType.VarChar);                    parameter.Value = newUsername.ToLower();                    command.Parameters.Add(parameter);                    return command.ExecuteNonQuery() > 0;                }            }        }    }}


Scott Mitchell has a great article describing how to handle this situation here: http://www.4guysfromrolla.com/articles/070109-1.aspx

Important quote from his article:

Unfortunately, idealism and pragmatism only rarely intersect. In some cases - such as allowing a user to change their username - we have no choice but to work directly with the underlying data store.

He also shows how to re-authenticate the user after changing their username/email.