Aspx, глобальный экземпляр класса, возможная ошибка в структуре кода - PullRequest
1 голос
/ 22 июня 2011

Я отслеживаю ошибку в каком-то старом коде aspx. Проблема в том, что один очень редкий случай (1 / 10.000 просмотров страниц или около того) двух пользователей смешивается, т.е. пользователь A видит данные пользователя B.

Вот как структурирован код: у нас есть пользовательский класс, который определен в модуле, подобном этому:

Public Module MyGlobals
    Public myUser As CMyUser
End Module

На странице входа в систему мы проверяем имя пользователя / пароль, и если он действителен, то соответствующий идентификатор пользователя загружается из db, и мы делаем:

FormsAuthentication.SetAuthCookie(userid, False)

Затем мы перенаправляем в безопасную зону. В защищенных областях MasterPage при событии Page_Init мы имеем:

If Context.User.Identity.IsAuthenticated then
    ' Initialize the user class (user data is loaded)
    MyGlobals.myUser = New CMyUser(Context.User.Identity.Name)
Else
    ' Redirect to loginpage
End If

Здесь и далее безопасный доступ к

MyGlobals.myUser

экземпляр с каждой страницы, на которой защищенная мастер-страница является главной, или могут быть проблемы с этой структурой?

1 Ответ

2 голосов
/ 22 июня 2011

Модуль VB.Net похож на статический класс с закрытым конструктором и только статическими полями в C #.

Это означает, что все переменные, объявленные в модуле, являются общими для всех потоков.Следовательно, каждый запрос (Пользователь), использующий этот модуль, будет перезаписывать старое значение.

Я настоятельно рекомендую использовать Session для хранения данных, чувствительных к пользователю.Но я не уверен, почему вы хотите сохранить имя пользователя, потому что оно уже сохранено при использовании FormsAuthentication (как вы показали себя выше).

Если вам действительно нужна эта обертка, вы можете легко достичь ее дажестатический контекст через HttpContext.Current.Session:

Module MyGlobals
    Public Property myUser As CMyUser
        Get
            If HttpContext.Current.Session("CurrentUser") Is Nothing Then
                Return Nothing
            Else
                Return DirectCast(HttpContext.Current.Session("CurrentUser"), CMyUser)
            End If
        End Get
        Set(ByVal value As CMyUser)
            HttpContext.Current.Session("CurrentUser") = value
        End Set
    End Property
End Module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...