【问题标题】:Issue with HttpContext.Current.User.Identity.NameHttpContext.Current.User.Identity.Name 的问题
【发布时间】:2012-02-26 13:30:24
【问题描述】:

在大约 100 多个用户登录到一个网站的环境中 形成身份验证,调用 HttpContext.Current.User.Identity.Name 返回正确登录的用户。

但是,有 10% 的时间返回了错误的用户全名信息。 我的测试机器上从来没有遇到过这样的问题,它只发生在生产中。我无法在我的测试机器上重新创建与许多用户相同的环境。

这个应用的逻辑:

1) 用户输入用户名并通过,通过 SQL DB 调用查找信息,如果匹配,用户通过身份验证 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)重定向后,我将用户全名放入隐藏字段

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) 在用户访问的所有页面上,他/她的信息都显示在母版页上的 Label 中

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

这几乎一直有效。任何想法为什么它可能会失败 时不时?

【问题讨论】:

  • 请向我们展示您的GetCurrentUserFullName() 方法的代码。
  • 错误信息是什么意思?是别人的名字吗?是空白吗?
  • 变量userFullName是如何声明的?
  • 它显示了别人的名字。
  • userFullName 是页面上的隐藏字段

标签: asp.net forms-authentication httpcontext


【解决方案1】:

没有更多代码,我只能猜测你的问题。由于其他人可能会发现您的问题并遇到类似的问题,我猜您的问题在于错误使用静态类或属性。

您的GetCurrentUserFullName() 方法可能依赖于在所有线程之间静态共享的数据访问方法。数据访问类中可能存在竞争条件,这有时会导致正在搜索的用户的 id 在检索数据之前被另一个请求的 id 替换。对此的解决方案是(a)在数据访问类的所有关键部分中使用锁或(b)使用为每个请求(实际上是每个工作单元)实例化新数据访问类的解决方案)。后一种设计要求您的数据访问类是轻量级的,但更可取,因为它也更容易测试。

如果您在静态属性或其他将在线程之间共享的静态类中缓存值,也可能存在类似的竞争条件,其中这些值被缓存和使用。类似的解决方案将适用 - 使用锁定或使用每线程实例而不是静态实例。

【讨论】:

  • 非常感谢您的精彩解释,我认为这是因为它是静态方法,所以我会更改它。
  • @user1023623 可能在GetCurrentUserID() 或 DAL 内再低一级。在某些时候,您有一个方法正在引用线程之间共享的静态变量。局部变量应该是线程安全的,因为每个线程都有自己的堆栈。
  • GetCurrentUserID() 也是返回 HttpContext.Current.User.Identity.Name 的静态方法。它会因此返回错误的 Identity.Name 吗?
  • userFullName 怎么样 - 这是一个静态变量吗?
  • userFullName 是页面上的隐藏字段
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
相关资源
最近更新 更多