2010-01-26 16 views
5

Sono in grado di modificare un nome utente accedendo direttamente alle tabelle utente di appartenenza di asp.net. Tuttavia, il vecchio nome utente viene conservato in una nuova riga e assegnato automaticamente un nuovo ID utente da asp.net. Come faccio a impedire che ciò accada?Modifica nome utente in abbonamento Asp.Net

MODIFICA: solo nella tabella utenti e tabella ruoli, non nella tabella di appartenenza.

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

ho capito che il problema ha a che fare con l'assegnazione di un ruolo al vecchio oggetto di appartenenza per il vecchio nome degli utenti che non esisteva. quindi è stata aggiunta automaticamente una nuova riga di ruoli e un ID utente creato dalle classi dei ruoli. – zsharp

+0

Quindi, cosa hai fatto per risolvere il problema? – CompanyDroneFromSector7G

risposta

0

Come hai cambiato il nome utente? L'ho appena fatto usando una dichiarazione di aggiornamento SQL e aggiornato il nome utente senza creare nuove righe o preservare il vecchio nome utente.

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

utilizzando il collegamento a sql – zsharp

+0

si prega di fornire maggiori dettagli .. il problema potrebbe essere nella query linq che hai usato per fare l'aggiornamento. il codice SQL qui sopra aggiorna il campo del nome utente senza causare la creazione di un nuovo record. –

+0

vedi sopra. l'ho eseguito anche con istruzioni SQL e lo stesso risultato – zsharp

1

devi cambiare sia UserName e LoweredUserName ... Suppongo che l'API utilizzata l'altro campo, ha fatto la ricerca, ha osservato il record non esisteva (perché quello è stato cambiato), e ha creato un nuovo uno. In genere, non conserva i vecchi record.

MODIFICA: Il problema potrebbe riguardare anche l'account dal campo ProviderUserKey?

+0

avevo cambiato entrambi. il nuovo nome utente funziona bene, ma la tabella ha la riga aggiunta per il vecchio nome. (solo nella tabella utenti e nella tabella dei ruoli, non nella tabella di appartenenza) – zsharp

+0

esegue la ricerca per ID utente – zsharp

+0

Il problema potrebbe essere il campo provideruserkey da cui si sta eseguendo l'interrogazione? Inoltre, si utilizza SingleOrDefault, perché nessun controllo Null? –

10

La modifica del nome utente non è supportata dal provider di appartenenza SQL in ASP.NET 2.0. Puoi ancora cambiare il nome utente, ma devi usare l'implementazione personalizzata.

Inoltre, è necessario aggiornare il cookie di appartenenza con il nuovo nome utente per evitare di ricreare l'utente con lo stesso nome utente ma nuovo ID utente.

Nell'esempio seguente, utilizzo Linq su SQL per aggiornare le tabelle di appartenenza: il contesto dati è denominato 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

quando si utilizza FormsAuthentication.setauthcookie, non è il cookie creato per te? perché creare manualmente come hai fatto? – zsharp

+0

Non imposto manualmente il cookie, lo uso solo per ottenere l'istanza di FormsAuthenticationTicket. –

+0

il mio punto era che non capisco perché è necessario ottenere l'istanza del biglietto. Se ti basta firmare e firmare nuovamente non è abbastanza? – zsharp

Problemi correlati