Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Если вы используете 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 [email protected],[email protected] WHERE [email protected]";

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

Ответ 3

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

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

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

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

Ответ 4

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

http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

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

  • Создайте нового пользователя, используя новый адрес электронной почты
  • Получите пароль старой учетной записи и установите ее в новую учетную запись. Если вы не можете получить старый пароль через членство, обратитесь к пользователю.
  • Создайте новый профиль для новой учетной записи пользователя
  • Скопировать все свойства из старого профиля в новый объект профиля.
  • Выйти из старой учетной записи
  • Автоматический вход в новую учетную запись, чтобы пользователь не заметил, что произошло просто невероятно.

Ответ 5

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

Ответ 6

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

        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 [email protected], [email protected] WHERE [email protected]"))
        {
            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);                
        }
    }

Ответ 7

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

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