Frage

Ich bin mit dem Standard-SQL-Mitgliedschaftsanbieter mit ASP.NET, und ich möchte eine Seite zur Verfügung zu stellen, um den Benutzernamen des Benutzers zu ändern. Ich glaube, ich bin sicher, dass ich dies mit einem benutzerdefinierten Anbieter tun könnte, aber kann dies mit den Standard-Provider zu tun?

Der zweite Teil meiner Frage ist: Soll ich erlauben Benutzern, ihre Benutzernamen zu ändern, nachdem das Konto erstellt wird?

War es hilfreich?

Lösung

Es ist wahr, dass die Standard-SQL-Mitgliedschaftsanbieter nicht Benutzernamen Änderungen zulässt. Allerdings gibt es keinen inneren Grund zu verhindern, dass Benutzer ändern ihre Benutzernamen, wenn Sie ein gültiges Argument haben, auf Ihrer Website, um es zu ermöglichen. Keine der Tabellen in der SQL-Datenbank den Benutzernamen als Schlüssel haben, ist alles, was auf der Grundlage der Identifikation des Benutzers, so von einer Implementierung Perspektive es ziemlich einfach sein würde.

Andere Tipps

Wenn Sie SqlMembershipProvider verwenden, können Sie es erweitern können - es bezieht sich auch href="https://stackoverflow.com/questions/3762567/custom-asp-net-sqlmembershipprovider-handling-connection-string"> dies .
Roadkill ist ein Wiki-Engine keine Beschreibung meiner Codierstil.

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 hat einen großen Artikel beschreibt, wie mit dieser Situation umgehen hier: http: // www.4guysfromrolla.com/articles/070109-1.aspx

Wichtiges Zitat aus dem Artikel:

Leider Idealismus und Pragmatismus nur selten überschneiden. In einigen Fällen - wie zum Beispiel einem Benutzer ermöglicht, ihren Benutzernamen zu ändern -. Wir keine andere Wahl haben, sondern direkt mit dem zugrunde liegenden Datenspeicher zu arbeiten

Er zeigt auch, wie neu zu authentifizieren die Benutzer nach ihrem Benutzername / E-Mail zu ändern.

Wenn Sie, dass mit der Mitgliedschaft API tun wollen, scheint es der richtige Weg, so sein würde:

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

Im Grunde müssen Sie folgendes tun (ich aus den obigen Link kopiert, der Vollständigkeit halber):

  1. Erstellen Sie einen neuen Benutzer die neue E-Mail-Adresse
  2. Holen Sie sich das Passwort des alten Kontos und es auf das neue Konto ein. Wenn Sie nicht das alte Passwort über Membership Provider bekommen können, dann Benutzer fragen.
  3. Erstellen Sie ein neues Profil für das neue Benutzerkonto
  4. Kopieren Sie alle Eigenschaften aus dem alten Profil in das neue Profil-Objekt.
  5. Benutzer abmelden aus altem Konto
  6. Automatische Anmeldung bei dem neuen Konto, so dass Benutzer nicht bemerkt, was eine unglaubliche Sache ist einfach passiert.

Da Membershiop API nicht Benutzername Modifikation direkt zulassen, können Sie direkt die aspnet_Membership Tabelle in Ihrer Datenbank zugreifen zu können.

Hier ist eine Version, die die Enterprise-Bibliotheken DAB und ein paar andere kleinere Änderungen umfasst. Auch ich sehe keinen Punkt in einem Booleschen Rückkehr, da sie entweder gehen erfolgreich sein oder eine Ausnahme aus.

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

Nein, die MembershipUser Klasse erlaubt nicht die Username-Eigenschaft zu ändern, so dass Sie es nicht tun können.

Praktisch sollten Sie den Benutzernamen zu ändern, nicht zulassen. Wenn Sie erlauben, so irgendwie zu tun, dann wird es seinen Zweck und Natur verlieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top