2010-01-26 6 views
5

Я могу изменить имя пользователя, напрямую обращаясь к пользовательским таблицам членства asp.net. Однако прежнее имя пользователя сохраняется в новой строке и автоматически назначается новым UserID asp.net. Как я могу прекратить это?Изменение имени пользователя в Asp.Net Membership

EDIT: только в таблице таблиц пользователей и ролей, а не в таблице членства.

var mUser = dc.aspnet_Users 
      .Where(u => u.UserId == (Guid)user.ProviderUserKey) 
      .Select(u => u).SingleOrDefault(); 

mUser.UserName = newName; 
mUser.LoweredUserName = newName.ToLower(); 

try 
{ 
    dc.SubmitChanges(); 
} 
catch 
{ 
    ... 
} 
+0

Я получил его на работу, кажется, проблема связана с назначением роли для старого объекта членства для старого имени пользователя, которого не было. поэтому новая строка роли была добавлена ​​автоматически, а userid создан классами ролей. – zsharp

+0

Итак, что вы сделали, чтобы решить эту проблему? – CompanyDroneFromSector7G

ответ

0

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

UPDATE [MyDatabase].[dbo].[aspnet_Users] 
SET [UserName] = 'mynewusername', 
    [LoweredUserName] = LOWER('mynewusername') 
WHERE [UserName] = 'myusername' 
+0

, используя ссылку на sql – zsharp

+0

, пожалуйста, предоставьте более подробную информацию .. проблема может быть в запросе linq, который вы использовали для обновления. код sql выше обновляет поле имени пользователя, не создавая новую запись. –

+0

см. Выше. Я также запускал его с операторами sql и тем же результатом – zsharp

1

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

EDIT: Возможно ли, что вы ищете учетную запись на поле ProviderUserKey?

+0

Я изменил оба. новое имя пользователя отлично работает, но в таблице есть добавленная строка для старого имени. (только в таблице таблицы пользователей и ролей, а не в таблице членства) – zsharp

+0

выполняет поиск по идентификатору пользователя – zsharp

+0

Может ли проблема быть поле provideruserkey, которое вы запрашиваете? Кроме того, вы используете SingleOrDefault, почему нет нулевой проверки? –

10

Изменение имени пользователя не поддерживается поставщиком членства sql в ASP.NET 2.0. Вы все равно можете изменить имя пользователя, но вы должны использовать пользовательскую реализацию.

Также вам необходимо обновить cookie членства новым именем пользователя, чтобы избежать отдыха пользователя с тем же именем пользователя, но с новым UserId.

В приведенном ниже примере я использую Linq to SQL для обновления таблиц членства - у меня есть контекст данных, называемый MembershipDataContext.

public bool ChangeUserName(Guid userId, string newUserName) 
{ 
    bool success = false; 
    newUserName = newUserName.Trim(); 

    // Make sure there is no user with the new username 
    if (Membership.GetUser(newUserName) == null) 
    { 
     MembershipUser u = Membership.GetUser(userId); 
     string oldUsername = u.UserName; 
     // get current application 

     MembershipDataContext context = new MembershipDataContext(); 
     aspnet_User userToChange = (from user in context.aspnet_Users 
            where user.UserId == userId 
            select user).FirstOrDefault(); 

     if (userToChange != null) 
     { 
      userToChange.UserName = newUserName; 
      userToChange.LoweredUserName = newUserName.ToLower(); 

      context.SubmitChanges(); 

      // ASP.NET Issues a cookie with the user name. 
      // When a request is made with the specified cookie, 
      // ASP.NET creates a row in aspnet_users table. 
      // To prevent this sign out the user and then sign it in 

      string cookieName = FormsAuthentication.FormsCookieName; 
      HttpCookie authCookie = 
       HttpContext.Current.Request.Cookies[cookieName]; 

      FormsAuthenticationTicket authTicket = null; 

      try 
      { 
       authTicket = 
        FormsAuthentication.Decrypt(authCookie.Value); 

       FormsIdentity formsIdentity = 
        new FormsIdentity(
         new FormsAuthenticationTicket(
          authTicket.Version, 
          newUserName, 
          authTicket.IssueDate, 
          authTicket.Expiration, 
          authTicket.IsPersistent, 
          authTicket.UserData)); 

       string y = HttpContext.Current.User.Identity.Name; 
       string[] roles = 
        authTicket.UserData.Split(new char[] { '|' }); 
       System.Security.Principal.GenericPrincipal genericPrincipal = 
        new System.Security.Principal.GenericPrincipal(
                 formsIdentity, 
                 roles); 

       HttpContext.Current.User = genericPrincipal; 
      } 
      catch (ArgumentException ex) 
      { 
       // Handle exceptions 
      } 
      catch(NullReferenceException ex) 
      { 
       // Handle exceptions 
      } 

      FormsAuthentication.SignOut(); 
      HttpContext.Current.Session.Abandon(); 
      FormsAuthentication.SetAuthCookie(newUserName, false); 
      success = true; 
     } 
    } 

    return success; 
} 
+0

, когда вы используете FormsAuthentication.setauthcookie, разве cookie создан для вас? почему вручную создавать, как вы? – zsharp

+0

Я не устанавливаю cookie вручную, я просто использую его для получения экземпляра FormsAuthenticationTicket. –

+0

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

Смежные вопросы