Проблема с HttpContext.Current.User.Identity.Name - PullRequest
6 голосов
/ 26 февраля 2012

В среде, где около 100+ пользователей входят на сайт с аутентификацией по формам, вызов HttpContext.Current.User.Identity.Name возвращает корректно зарегистрированного пользователя.

Однако 10%время неправильный пользователь Полное имя информация возвращается.У меня никогда не было такой проблемы на моей тестовой машине, это происходит только в производстве.Я не могу воссоздать ту же среду со многими пользователями на моей тестовой машине.

Логика этого приложения:

1) Пользователь вводит имя пользователя и передает, информация просматривается с помощью вызова БД SQL, еслисоответствует, пользователь проходит проверку подлинности через FormsAuthentication.RedirectFromLoginPage (имя пользователя, ложь)

 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) На всехна страницах, которые посещает пользователь, его / ее информация отображается внутри ярлыка, который находится на главной странице

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

Это работает почти все время.Есть идеи, почему он может время от времени терпеть неудачу?

1 Ответ

1 голос
/ 26 февраля 2012

Отсутствует больше кода, я могу только догадываться о вашей проблеме. Поскольку другие люди могут найти ваш вопрос и столкнуться с аналогичными проблемами, я предполагаю, что ваша проблема заключается в неправильном использовании статических классов или свойств.

Ваш GetCurrentUserFullName() метод может полагаться на метод доступа к данным, который статически распределяется между всеми потоками. В классе (ах) доступа к данным может быть состояние состязания, которое иногда приводит к тому, что идентификатор пользователя, который ищется для замены, заменяется идентификатором из другого запроса перед извлечением данных. Решением этого является либо (а) использование блокировок во всех критических разделах вашего класса (ов) доступа к данным, либо (б) использование решения, которое создает новый класс (ы) доступа к данным для каждого запроса (на самом деле, каждой единицы работы). ). Последний дизайн требует, чтобы ваши классы доступа к данным были легковесными, но было бы предпочтительнее, так как их будет проще тестировать.

Также возможно, если вы кэшируете значения в статических свойствах или других статических классах, которые будут совместно использоваться потоками, у вас есть аналогичное состояние гонки, когда эти значения кэшируются и используются. Аналогичные решения применимы - с использованием блокировки или использования экземпляров для каждого потока, а не статических.

...