Можно ли изменить имя пользователя с помощью API членства

Я использую поставщик членства sql по умолчанию с ASP.NET и я хотел бы предоставить страницу для изменения имени пользователя. Я уверен, что могу сделать это с настраиваемым поставщиком, но можно ли это сделать с поставщиком по умолчанию?

вторая часть моего вопроса: Должен ли я разрешить пользователям изменять свое имя пользователя после создания учетной записи?

7 ответов


Это правда, что поставщик членства SQL по умолчанию не разрешает изменения имени пользователя. Однако нет никаких внутренних причин запрещать пользователям изменять свои имена пользователей, если у вас есть допустимый аргумент на вашем сайте. Ни одна из таблиц в базе данных SQL не имеет имени пользователя в качестве ключа, все основано на идентификаторе пользователя, поэтому с точки зрения реализации это было бы довольно легко.


Если вы используете SqlMembershipProvider, вы можете расширить его - он также относится к этот вопрос.
Мертвец - это движок wiki, а не описание моего стиля кодирования.

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

Скотт Митчелл и многие статьи, описывающие, как ручка вот такая ситуация: http://www.4guysfromrolla.com/articles/070109-1.aspx

важная цитата из его статьи:

к сожалению, идеализм и прагматизм, только редко пересекаемся. В некоторых случаях-например, когда пользователь может изменить свое имя пользователя - у нас нет выбора, кроме как работать непосредственно с базовым хранилищем данных.

Он также показывает, как повторная аутентификация пользователя после изменения его имени пользователя / электронной почты.


Если вы хотите сделать это с API членства, кажется, правильный способ будет следующим:

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

в принципе, вы должны сделать следующее (Я скопировал по ссылке выше, для полноты картины):

  1. создать нового пользователя, используя новый адрес электронной почты
  2. получите пароль старой учетной записи и установите его в новую учетную запись. Если вы не удается получить старый пароль через поставщика членства, а затем спросить пользователя.
  3. создать новый профиль для новой учетной записи пользователя
  4. скопировать все свойства из старого профиля в новый профиль объекта.
  5. выход пользователя из старого аккаунта
  6. авто войдите в новую учетную запись, чтобы пользователь не заметил, что невероятная вещь только что произошла.

поскольку Membershiop API не позволяет изменять имя пользователя напрямую, вы можете получить доступ непосредственно к aspnet_Membership таблицы в вашей базе данных.


вот версия, которая включает в себя корпоративные библиотеки DAB и несколько других незначительных изменений. Кроме того, я не вижу смысла возвращать логическое значение, так как оно либо будет успешным, либо создаст исключение.

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

нет, класс MembershipUser не позволяет изменять свойство Username, поэтому вы не можете этого сделать.

практически Вы не должны позволять изменять имя пользователя. Если вы позволите сделать это так или иначе, он потеряет свою цель и природу.