Question

J'utilise le fournisseur d'appartenance SQL par défaut avec ASP.NET et j'aimerais fournir une page permettant de changer le nom d'utilisateur de l'utilisateur. Je pense pouvoir faire cela avec un fournisseur personnalisé, mais est-ce possible avec le fournisseur par défaut?

La deuxième partie de ma question est la suivante: Dois-je autoriser les utilisateurs à changer leur nom d'utilisateur après la création du compte?

Était-ce utile?

La solution

Il est vrai que le fournisseur d'adhésion SQL par défaut n'autorise pas les modifications de nom d'utilisateur. Cependant, il n'y a aucune raison intrinsèque d'empêcher les utilisateurs de changer leur nom d'utilisateur si vous disposez d'un argument valide pour l'autoriser. Aucune des tables de la base de données SQL n'a le nom d'utilisateur en tant que clé. Tout est basé sur l'ID de l'utilisateur. Du point de vue de la mise en œuvre, ce serait donc assez facile.

Autres conseils

Si vous utilisez SqlMembershipProvider , vous pouvez l'étendre - cela concerne également cette question .
Roadkill est un moteur de wiki et non une description de mon style de codage.

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 a rédigé un excellent article décrivant comment gérer cette situation: http: // www.4guysfromrolla.com/articles/070109-1.aspx

Citation importante de son article:

Malheureusement, idéalisme et pragmatisme ne se croisent que rarement. Dans certains cas, comme permettre à un utilisateur de modifier son nom d'utilisateur, nous n'avons d'autre choix que de travailler directement avec le magasin de données sous-jacent.

Il montre également comment ré-authentifier l'utilisateur après avoir changé son nom d'utilisateur / email.

L'API Membershiop n'autorisant pas la modification de nom d'utilisateur directement, vous pouvez accéder directement à la table aspnet_Membership de votre base de données.

Voici une version qui incorpore le DAB de bibliothèques d’entreprise et quelques autres modifications mineures. De plus, je ne vois pas l'intérêt de renvoyer un booléen, car il réussit ou génère une exception.

        public static void 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.Equals(newUsername))
        {
            return;
        }

        Database db = DatabaseFactory.CreateDatabase();
        using (DbCommand cmd = db.GetSqlStringCommand("UPDATE dbo.aspnet_Users SET UserName=@NewUsername, LoweredUserName=@LoweredNewUsername WHERE UserName=@OldUsername"))
        {
            db.AddInParameter(cmd, "@OldUsername", DbType.String, oldUsername);
            db.AddInParameter(cmd, "@NewUsername", DbType.String, newUsername);
            db.AddInParameter(cmd, "@LoweredNewUsername", DbType.String, newUsername.ToLower());

            db.ExecuteNonQuery(cmd);                
        }
    }

Non, la classe MembershipUser ne permet pas de modifier la propriété Username afin que vous ne puissiez pas le faire.

En pratique, vous ne devriez pas autoriser le changement de nom d'utilisateur. Si vous le permettez, il perdra sa raison d'être et sa nature.

scroll top