2010-01-26 33 views
5

Tôi có thể thay đổi tên người dùng bằng cách truy cập trực tiếp vào bảng người dùng thành viên asp.net. Tuy nhiên, tên người dùng cũ được lưu giữ trong một hàng mới và được gán một UserID mới tự động bởi asp.net. Làm thế nào để tôi ngừng điều đó xảy ra?Thay đổi tên người dùng theo cách thủ công trong Thành viên Asp.Net

CHỈNH SỬA: chỉ trong bảng người dùng và bảng vai trò, không phải bảng thành viên.

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

tôi đã làm việc này có vẻ như vấn đề phải làm với việc gán vai trò cho đối tượng thành viên cũ cho tên người dùng cũ không tồn tại. do đó, một hàng vai trò mới được thêm tự động và một userid được tạo bởi các lớp vai trò. – zsharp

+0

Vì vậy, bạn đã làm gì để giải quyết vấn đề? – CompanyDroneFromSector7G

Trả lời

0

Bạn thay đổi tên người dùng như thế nào? Tôi chỉ cần làm điều đó bằng cách sử dụng một câu lệnh sql cập nhật và cập nhật tên người dùng mà không tạo hàng mới hoặc bảo tồn tên người dùng cũ.

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

sử dụng liên kết tới sql – zsharp

+0

vui lòng cung cấp thêm chi tiết .. sự cố có thể nằm trong truy vấn LINQ mà bạn đã sử dụng để thực hiện cập nhật. mã sql ở trên cập nhật trường tên người dùng mà không gây ra bản ghi mới được tạo. –

+0

xem ở trên. tôi cũng chạy nó với báo cáo sql và kết quả tương tự – zsharp

1

Bạn cần phải thay đổi cả UserName và LoweredUserName ... Tôi giả sử các API được sử dụng các lĩnh vực khác, đã tra cứu, quan sát kỷ lục chưa từng tồn tại (vì một trong những đã được thay đổi), và tạo ra một mới một. Thông thường, nó không bảo tồn các bản ghi cũ.

EDIT: Có thể vấn đề bạn đang tìm kiếm tài khoản theo trường ProviderUserKey?

+0

tôi đã thay đổi cả hai. tên người dùng mới hoạt động tốt, nhưng bảng có hàng được thêm cho tên cũ. (chỉ trong bảng người dùng và bảng vai trò, không nằm trong bảng thành viên) – zsharp

+0

tìm kiếm theo userid – zsharp

+0

Trường hợp có thể là trường provideruserkey mà bạn đang truy vấn không? Ngoài ra, bạn sử dụng SingleOrDefault, tại sao không kiểm tra null? –

10

Thay đổi tên người dùng không được nhà cung cấp thành viên sql hỗ trợ trong ASP.NET 2.0. Bạn vẫn có thể thay đổi tên người dùng nhưng bạn phải sử dụng triển khai tùy chỉnh.

Ngoài ra, bạn phải cập nhật cookie thành viên bằng tên người dùng mới để tránh việc giải trí của người dùng có cùng tên người dùng nhưng UserId mới.

Trong ví dụ bên dưới, tôi sử dụng LINQ to SQL để cập nhật bảng thành viên - Tôi có bối cảnh dữ liệu được gọi là 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

khi bạn sử dụng FormsAuthentication.setauthcookie, không phải cookie được tạo cho bạn phải không? tại sao tạo thủ công như bạn đã làm? – zsharp

+0

Tôi không đặt cookie theo cách thủ công Tôi chỉ sử dụng nó để có được phiên bản của FormsAuthenticationTicket. –

+0

quan điểm của tôi là tôi không hiểu tại sao bạn cần phải có được ví dụ của vé. Nếu bạn vừa đăng xuất và đăng nhập lại thì không đủ? – zsharp

Các vấn đề liên quan