2012-02-26 41 views
6

Trong môi trường có khoảng 100 người dùng đang đăng nhập vào trang web có xác thực biểu mẫu , hãy gọi HttpContext.Current.User.Identity.Name trả về người dùng đã đăng nhập chính xác .Vấn đề với HttpContext.Current.User.Identity.Name

Tuy nhiên, 10% thời gian người dùng sai Thông tin tên đầy đủ đang được trả lại. Tôi chưa bao giờ gặp vấn đề như vậy trên máy thử nghiệm của mình, nó chỉ xảy ra trong quá trình sản xuất. Tôi không thể tạo lại cùng một môi trường với nhiều người dùng trên máy thử nghiệm của mình.

Logic của ứng dụng này:

1) dùng nhập tên đăng nhập và vượt qua, thông tin được nhìn lên qua SQL DB cuộc gọi, nếu trận đấu, người dùng được xác thực thông qua FormsAuthentication.RedirectFromLoginPage (username, false)

FormsAuthentication.SetAuthCookie(user.SYS_Users_ID.ToString(), false); 

if (Request["ReturnURL"] == null) 
    FormsAuthentication.RedirectFromLoginPage(user.SYS_Users_ID.ToString(), false); 
else 
    Response.Redirect("/" + SysConfig.ApplicationName + appConfig.DefaultPages.DefaultPage); 

2) Sau khi chuyển hướng tôi đặt người dùng đầy đủ Tên thành lĩnh vực ẩn

if (!IsPostBack) 
    userFullName.Value = Helper.GetCurrentUserFullName(); 

... 

public static string GetCurrentUserFullName() 
{ 
    string _userFullName = string.Empty; 
    try 
    { 
     _userFullName = new AgrotMasofim.DAL.Users.Users().GetUserFullName(GetCurrentUserID()); 
    } 
    catch (Exception ex) 
    { 
     Logs.WriteToFileLog(string.Empty,ex); 
    } 
    return _userFullName; 
} 



public static Decimal GetCurrentUserID() 
     { 
      Decimal _userID = 0; 

      if (HttpContext.Current.User != null) 
      { 
       try 
       { 
        _userID = Convert.ToDecimal(HttpContext.Current.User.Identity.Name); 
       } 
       catch (Exception ex) 
       { 
        Logs.WriteToFileLog(string.Empty, ex); 
       } 
      } 
      return _userID; 
     } 

3) Trên tất cả các trang người dùng truy cập, ông/h thông tin er được hiển thị bên trong Nhãn nằm trên trang chính

lblUserName.Text = HttpUtility.HtmlDecode("Hello " + userFullName.Value); 

Điều này hầu như luôn hoạt động. Bất kỳ ý tưởng nào tại sao nó có thể bị lỗi từ theo thời gian?

+1

Vui lòng hiển thị mã cho phương thức 'GetCurrentUserFullName()' của bạn. – tvanfosson

+0

Bạn có ý gì bởi thông tin sai? Có phải tên của người khác không? Nó có trống không? – Aliostad

+0

Biến userFullName được khai báo như thế nào? –

Trả lời

1

Mã bị thiếu nhiều hơn, tôi chỉ có thể đoán được sự cố của bạn. Vì những người khác có thể tìm thấy câu hỏi của bạn và có vấn đề tương tự, tôi đoán rằng vấn đề của bạn nằm trong việc sử dụng bị lỗi các lớp hoặc thuộc tính tĩnh.

Phương thức GetCurrentUserFullName() của bạn có thể dựa vào phương thức truy cập dữ liệu được chia sẻ tĩnh giữa tất cả các chuỗi. Có thể có điều kiện chủng tộc trong lớp truy cập dữ liệu đôi khi dẫn đến id của người dùng đang được tìm kiếm thay thế bằng từ yêu cầu khác trước khi dữ liệu được truy xuất. Giải pháp cho điều này là (a) sử dụng khóa trong tất cả các phần quan trọng của lớp truy cập dữ liệu hoặc (b) sử dụng giải pháp khởi tạo một lớp truy cập dữ liệu mới cho mỗi yêu cầu (thực sự mỗi đơn vị công việc). Thiết kế thứ hai yêu cầu các lớp truy cập dữ liệu của bạn có trọng lượng nhẹ, nhưng sẽ thích hợp hơn vì nó cũng sẽ dễ dàng hơn để kiểm tra. Cũng có thể, nếu bạn đang lưu vào bộ nhớ đệm các giá trị trong thuộc tính tĩnh hoặc các lớp tĩnh khác sẽ được chia sẻ giữa các chủ đề, bạn có một điều kiện chủng tộc tương tự nơi các giá trị đó được lưu trữ và sử dụng. Các giải pháp tương tự sẽ được áp dụng - sử dụng khóa hoặc sử dụng các cá thể trên mỗi luồng thay vì các cá thể tĩnh.

+0

Cảm ơn bạn rất nhiều vì lời giải thích tốt, tôi sẽ nghĩ rằng nó xảy ra bởi vì nó là một phương pháp tĩnh, tôi sẽ thay đổi nó. – Katya

+0

@ user1023623 Có thể giảm thêm một cấp trong 'GetCurrentUserID()' hoặc bên trong DAL. Tại một số điểm bạn có một phương thức tham chiếu một biến tĩnh được chia sẻ giữa các luồng. Các biến cục bộ phải là an toàn luồng vì mỗi luồng có ngăn xếp riêng của nó. – tvanfosson

+0

GetCurrentUserID() cũng là một phương thức tĩnh trả về HttpContext.Current.User.Identity.Name. Nó có thể trả về một sai lầm Identity.Name bacause của điều này? – Katya