我可以通过直接访问asp.net成员资格用户表来更改用户名.但是,旧用户名保留在新行中,并由asp.net自动分配新的UserID.我如何阻止这种情况发生?
编辑:仅在users表和角色表中,而不是在成员资格表中.
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 { ... }
解决方法
ASP.NET 2.0中的sql成员资格提供程序不支持更改用户名.您仍然可以更改用户名,但必须使用自定义实现.
此外,您必须使用新用户名更新成员资格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; }