Изменение имени пользователя в ASP.NET - PullRequest
20 голосов
/ 05 августа 2009

У меня есть сайт asp.net, который использует поставщика членства ASP.net. Каждый комментарий, запись и т. Д. В БД отслеживаются идентификатором пользователя.

Поскольку MS не предоставляет способ изменить имя пользователя, я нашел userNAME в таблице «users» в БД, и есть только 1 место, где появляется имя пользователя.

Мой вопрос,

Безопасно ли предоставить страницу «Изменить профиль», где пользователю разрешено редактировать свое имя пользователя. Конечно, я бы справился с этим изменением в фоновом режиме, напрямую изменив значение «username» в БД.

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

1 Ответ

14 голосов
/ 18 мая 2012

Ссылка cptScarlet была хорошей, однако я презираю использование хранимых процедур, если мне не нужно, и я предпочитаю Entity Framework, когда это возможно. Вот что я сделал, чтобы изменить имя пользователя, используя EF 4.0 и .NET 4.0:

  1. Проект правой кнопкой мыши -> Добавить новый элемент -> Модель данных сущности ADO.NET
  2. Дайте ему правильное имя, я выбрал «MembershipModel.edmx» и нажал «Добавить»
  3. Выберите «Создать из базы данных» и нажмите «Далее»
  4. Добавить подключение к вашей базе данных aspnetdb (членская база ASP.NET)
  5. Дайте ему правильное имя, я выбрал "MembershipEntities"
  6. Нажмите Далее
  7. Детализация в таблицах и выбор aspnet_Users
  8. Измените пространство имен модели на MembershipModel
  9. Нажмите Готово

Теперь вы можете добавить код для создания контекста объекта EF и изменения базы данных:

public void ChangeUserName(string currentUserName, string newUserName)
{
    using (var context = new MembershipEntities())
    {
        // Get the membership record from the database
        var currentUserNameLowered = currentUserName.ToLower();
        var membershipUser = context.aspnet_Users
            .Where(u => u.LoweredUserName == currentUserNameLowered)
            .FirstOrDefault();

        if (membershipUser != null)
        {
            // Ensure that the new user name is not already being used
            string newUserNameLowered = newUserName.ToLower();
            if (!context.aspnet_Users.Any(u => u.LoweredUserName == newUserNameLowered))
            {
                membershipUser.UserName = newUserName;
                membershipUser.LoweredUserName = newUserNameLowered;
                context.SaveChanges();
            }
        }
    }
}

Примечание. Я не учел идентификаторы приложений в своем коде. У меня обычно только одно приложение, использующее базу данных членства ASP.NET, поэтому, если у вас есть несколько приложений, вам придется учитывать это.

...