2010-01-26 14 views
5

Soy capaz de cambiar un nombre de usuario al acceder directamente a las tablas de usuarios de membresía asp.net. Sin embargo, el antiguo nombre de usuario se conserva en una nueva fila y se le asigna un nuevo ID de usuario automáticamente por asp.net. ¿Cómo evito que eso suceda?Cambio manual de nombre de usuario en Asp.Net Membresía

EDITAR: solo en la tabla de usuarios y la tabla de roles, no en la tabla de miembros.

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

Lo tengo que trabajar Parece que el problema tenía que ver con la asignación de un rol al antiguo objeto de membresía para el antiguo nombre del usuario que no existía. por lo tanto, se agregó automáticamente una nueva fila de roles y un ID de usuario creado por las clases de roles. – zsharp

+0

Entonces, ¿qué hiciste para resolver el problema? – CompanyDroneFromSector7G

Respuesta

0

¿Cómo se modificó el nombre de usuario? Lo acabo de hacer utilizando una declaración sql de actualización y actualicé el nombre de usuario sin crear nuevas filas o preservando el viejo nombre de usuario.

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

usando el enlace a sql – zsharp

+0

por favor brinde más detalles ... el problema podría estar en la consulta de linq que usó para hacer la actualización. el código sql anterior actualiza el campo de nombre de usuario sin hacer que se cree un nuevo registro. –

+0

ver arriba. También lo ejecuté con sentencias sql y el mismo resultado – zsharp

1

usted tiene que cambiar tanto nombre del usuario y LoweredUserName ... supongo que la API utiliza el otro campo, hizo la búsqueda, observó que no existía el registro (porque el que fue cambiado), y crearon una nueva uno. Por lo general, no conserva los registros anteriores.

EDIT: ¿Podría el problema también es que está buscando la cuenta en el campo ProviderUserKey?

+0

yo había cambiado ambos. el nuevo nombre de usuario funciona bien, pero la tabla tiene la fila agregada para el nombre anterior. (solo en la tabla de usuarios y en la tabla de roles, no en la tabla de membresía) – zsharp

+0

busca por el ID de usuario – zsharp

+0

¿Podría ser el problema el campo de usuario proveedor por el que está consultando? Además, usa SingleOrDefault, ¿por qué no hay verificación nula? –

10

Cambiar el nombre de usuario no es compatible con el proveedor de membresía sql en ASP.NET 2.0. Aún puede cambiar el nombre de usuario, pero debe usar la implementación personalizada.

También debe actualizar la cookie de membresía con el nuevo nombre de usuario para evitar la recreación del usuario con el mismo nombre de usuario pero con UserId nuevo.

En el siguiente ejemplo, utilizo Linq para SQL para actualizar las tablas de membresía. Tengo un contexto de datos llamado 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

cuando usa FormsAuthentication.setauthcookie, ¿no es la cookie creada para usted? ¿por qué crear manualmente como lo hizo? – zsharp

+0

No configuro la cookie manualmente. Solo la uso para obtener una instancia de FormsAuthenticationTicket. –

+0

mi punto es que no entiendo por qué necesita obtener la instancia del ticket. Si acaba de cerrar la sesión y volver a iniciar sesión no es suficiente? – zsharp

Cuestiones relacionadas