Domanda

Sto utilizzando il provider di appartenenza sql predefinito con ASP.NET e vorrei fornire una pagina per modificare il nome utente dell'utente. Credo di essere sicuro di poterlo fare con un fornitore personalizzato, ma è possibile farlo con il fornitore predefinito?

La seconda parte della mia domanda è: Devo consentire agli utenti di cambiare il loro nome utente dopo la creazione dell'account?

È stato utile?

Soluzione

È vero che il provider di appartenenze SQL predefinito non consente modifiche al nome utente. Tuttavia, non esiste alcun motivo intrinseco per impedire agli utenti di modificare i propri nomi utente se sul proprio sito è presente un argomento valido per consentirlo. Nessuna delle tabelle nel database SQL ha il nome utente come chiave, tutto si basa sull'ID dell'utente, quindi dal punto di vista dell'implementazione sarebbe abbastanza semplice.

Altri suggerimenti

Se si utilizza SqlMembershipProvider , è possibile estenderlo - si riferisce anche a questa domanda .
Roadkill è un motore wiki non una descrizione del mio stile di codifica.

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 ha pubblicato un ottimo articolo che descrive come gestire questa situazione qui: http: // www.4guysfromrolla.com/articles/070109-1.aspx

Citazione importante dal suo articolo:

Sfortunatamente, idealismo e pragmatismo si incrociano solo raramente. In alcuni casi, come consentire a un utente di modificare il proprio nome utente, non abbiamo altra scelta che lavorare direttamente con l'archivio dati sottostante.

Mostra anche come autenticare nuovamente l'utente dopo aver modificato il nome utente / e-mail.

Poiché l'API Membershiop non consente direttamente la modifica del nome utente, è possibile accedere direttamente alla tabella aspnet_Membership nel database.

Ecco una versione che incorpora il DAB Enterprise Libraries e un paio di altre modifiche minori. Inoltre, non vedo il punto di restituire un valore booleano, dal momento che ha successo o genera un'eccezione.

        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 classe MembershipUser non consente di modificare la proprietà Username quindi non è possibile farlo.

Praticamente non dovresti permettere al nome utente di cambiare. Se lo consenti in qualche modo, perderà il suo scopo e la sua natura.

scroll top