2012-02-26 17 views
6

フォーム認証でサイトに約100人以上のユーザーがログオンしている環境で、HttpContext.Current.User.Identity.Nameを呼び出すと、 は正しくログオンしたユーザーを返します。Issue with HttpContext.Current.User.Identity.Name

ただし、間違ったユーザーフルネーム情報が返されている時間の10%。 テストマシンでこのような問題が発生したことはありません。私はテストマシン上で多くのユーザーと同じ環境を再現することはできません。

このアプリのロジック:

1)ユーザーが一致する、ユーザーが偽 FormsAuthentication.RedirectFromLoginPage(ユーザー名)

経由で認証された場合の情報は、SQL DBの呼び出しを介して検索され、ユーザ名を入力して渡します私はすべてのページに隠されたフィールド

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)に、ユーザの訪問をユーザーの完全な名前を入れてリダイレクトした後

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)、彼/ Hマスターページにあるラベルの内側に表示されます

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

これはほぼ常に動作します。いつも から失敗する可能性があるアイデアはありますか?

+1

'GetCurrentUserFullName()'メソッドのコードを表示してください。 – tvanfosson

+0

間違った情報をどういう意味ですか?誰かの名前ですか?それは空白ですか? – Aliostad

+0

変数userFullNameはどのように宣言されていますか? –

答えて

1

より多くのコードがない場合、私はあなたの問題でしか推測できません。他の人があなたの質問を見つけるかもしれないし、同様の問題があるかもしれないので、私はあなたの問題が静的なクラスまたはプロパティの誤った使用にあると推測します。

GetCurrentUserFullName()メソッドは、すべてのスレッド間で静的に共有されるデータアクセスメソッドに依存する可能性があります。データアクセスクラスに競合状態が存在することがあります。その結果、データが取得される前に、ユーザーのIDが別の要求のIDに置き換えられることがあります。これを解決するには、(a)データアクセスクラスのすべてのクリティカルセクションでロックを使用するか、(b)各要求に対して新しいデータアクセスクラスをインスタンス化するソリューションを使用するか(実際には各作業単位)。後者の設計では、データアクセスクラスは軽量である必要がありますが、テストする方が簡単なので望ましいと思われます。

スレッド間で共有される静的プロパティまたはその他の静的クラスの値をキャッシュする場合、これらの値がキャッシュされて使用される類似の競合条件を持つこともできます。同様のソリューションが適用されます - 静的インスタンスではなく、スレッドごとのインスタンスをロックまたは使用します。

+0

良い説明をいただき、ありがとうございました。静的メソッドなので、私はそれが起こると思います。私はそれを変更します。 – Katya

+0

@ user1023623 'GetCurrentUserID()'またはDALの中でもう1つレベルダウンすることができます。ある時点で、スレッド間で共有される静的変数を参照するメソッドがあります。各スレッドは独自のスタックを持つため、ローカル変数はスレッドセーフでなければなりません。 – tvanfosson

+0

GetCurrentUserID()は、HttpContext.Current.User.Identity.Nameを返す静的メソッドです。間違ったアイデンティティを返すことができますか? – Katya