Pregunta

Estoy usando el proveedor de membresía de SQL predeterminado con ASP.NET y me gustaría proporcionar una página para cambiar el nombre de usuario del usuario. Creo que estoy seguro de que podría hacer esto con un proveedor personalizado, pero ¿se puede hacer con el proveedor predeterminado?

La segunda parte de mi pregunta es: ¿Debo permitir que los usuarios cambien su nombre de usuario después de crear la cuenta?

¿Fue útil?

Solución

Es cierto que el proveedor de membresía de SQL predeterminado no permite cambios de nombre de usuario. Sin embargo, no hay ninguna razón intrínseca para evitar que los usuarios cambien sus nombres de usuario si tiene un argumento válido en su sitio para permitirlo. Ninguna de las tablas en la base de datos SQL tiene el nombre de usuario como clave, todo se basa en la ID del usuario, por lo que desde la perspectiva de la implementación sería bastante fácil.

Otros consejos

Si usa SqlMembershipProvider , puede extenderlo, también se relaciona con esta pregunta .
Roadkill es un motor wiki que no es una descripción de mi estilo de codificación.

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 tiene un excelente artículo que describe cómo manejar esta situación aquí: http: // www.4guysfromrolla.com/articles/070109-1.aspx

Cita importante de su artículo:

Desafortunadamente, el idealismo y el pragmatismo rara vez se cruzan. En algunos casos, como permitir que un usuario cambie su nombre de usuario, no tenemos otra opción que trabajar directamente con el almacén de datos subyacente.

También muestra cómo volver a autenticar al usuario después de cambiar su nombre de usuario / correo electrónico.

Como la API Membershiop no permite la modificación de nombre de usuario directamente, puede acceder directamente a la tabla aspnet_Membership en su base de datos.

Aquí hay una versión que incorpora el DAB de Enterprise Libraries y un par de otros cambios menores. Además, no veo ningún punto en devolver un booleano, ya que va a tener éxito o lanza una excepción.

        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);                
        }
    }

No, la clase MembershipUser no permite modificar la propiedad de nombre de usuario por lo que no puede hacerlo.

Prácticamente no debes permitir que el nombre de usuario cambie. Si permites hacerlo de alguna manera, perderá su propósito y naturaleza.

scroll top