30

Вопрос по membership-provider, sqlmembershipprovider, membership, asp.net-membership, asp.net – Можно ли изменить имя пользователя с помощью API Членства?

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

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

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededRoadkillMembershipProviderError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Bobby Ortiz
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
7 ответов
  • 12

    Если вы используете

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

  • 4

    У Скотта Митчелла есть отличная статья

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

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

    Unfortunately, idealism and pragmatism only rarely intersect. In some cases - such as allowing a user to change their username - we have no choice but to work directly with the underlying data store.

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

  • -3

    Нет

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

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

  • 1

    Так как Membershiop API не позволяет изменять имя пользователя напряму

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

  • 2

    Если вы хотите сделать это с помощью API членства

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

    http://omaralzabir.com/how_to_change_user_name_in_asp_net_2_0_membership_provider/

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

    Create a new user using the new email address Get the password of the old account and set it to the new account. If you can’t get the old password via Membership provider, then ask user. Create a new profile for the new user account Copy all the properties from the old profile to the new profile object. Log out user from old account Auto sign in to the new account so that user does not notice what an incredible thing just happened.

  • 0

    Вот версия

    которая включает в себя 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 [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);                
            }
        }
    

  • 23

    Это правда

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