Можно ли изменить имя пользователя с помощью API Членства? - PullRequest
30 голосов
/ 16 июня 2009

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

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

Ответы [ 7 ]

23 голосов
/ 16 июня 2009

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

12 голосов
/ 27 февраля 2011

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

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;
                }
            }
        }
    }
}
4 голосов
/ 28 августа 2012

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

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

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

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

2 голосов
/ 01 ноября 2010

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

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

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

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

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

0 голосов
/ 17 февраля 2014

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

        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);                
        }
    }
0 голосов
/ 16 июня 2009

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

Практически не следует разрешать изменение имени пользователя. Если вы позволите это сделать каким-то образом, тогда он потеряет свою цель и природу.

...