Is it possible to change the username with the Membership API
Solution 1
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.
Solution 2
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;
}
}
}
}
}
Solution 3
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.
Solution 4
If you want to do that with the Membership API, it seems the right way would be like this:
http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/
Basically, you have to do the following (I copied from the above link, for sake of completeness):
- Create a new user using the new email address
- Get the password of the old account and set it to the new account. If you can’t get the old password via Membership provider, then ask user.
- Create a new profile for the new user account
- Copy all the properties from the old profile to the new profile object.
- Log out user from old account
- Auto sign in to the new account so that user does not notice what an incredible thing just happened.
Solution 5
Since Membershiop API does not allow username modification directly, you can access directly the aspnet_Membership
table in your database.
Comments
-
Nisarg about 4 years
I am using the default sql membership provider with ASP.NET and I would like to provide a page to change the user's username. I believe I am sure I could do this with a custom provider, but can this be done with the default provider?
Second part of my question is: Should I allow users to change their username after the account is created?