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;
}
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
Entonces, ¿qué hiciste para resolver el problema? – CompanyDroneFromSector7G