Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Если вы используете 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;
                }
            }
        }
    }
}

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

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

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

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

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

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

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

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

scroll top