В методе Init
параметр HttpApplication
описывается следующим образом:
HttpApplication, обеспечивающий доступ к методам, свойствам и событиям, общим для всех объектов приложения в ASP.NET-приложение
Ключевым моментом здесь является то, что существует один PageHttpModule
для времени жизни приложения, и все статические объекты, которые существуют во время жизни приложения, будут совместно использовать эти переменные.
НО ... время жизни CurrentUser
находится только в пределах события OnAuthenticateRequest
, если только какая-либо другая ссылка не поддерживает объект живым.Если бы это была PageHttpModule
переменная уровня участника, у вас были бы проблемы, которые вы бы сразу заметили.В вашей ситуации, однако, вы будете работать нормально , если не получите более одного одновременно обработанного OnAuthenticateRequest
вызова .
Ответ на ваш вопрос - нет, вы не гарантируете многопоточность.Если два запроса аутентификации поступают одновременно, вы не гарантируете, что одно событие будет завершено до того, как начнется другое, и в этом случае второй пользователь может оказаться аутентифицированным, когда это действительно первый пользователь, вошедший в систему.
Обновление Я думаю, что часть проблемы связана с неправильным пониманием AuthenticateRequest
... К тому времени, когда это событие вызывается, пользователь уже прошел проверку подлинности с помощью проверки подлинности Windows или Forms ... вы просто получаете уведомление о том, что это произошло,На самом деле свойство User.Identity.IsAuthenticated
уже установлено (я думаю, что это событие срабатывает, даже если пользователь не проходит аутентификацию, но я не буду клясться в этом без двойной проверки).
Если я понимаю, что выпосле, вы действительно пытаетесь написать свой собственный поставщик членства.Если вы воспользуетесь этим подходом, вы получите все преимущества встроенной аутентификации ... все стандартные свойства, связанные с аутентификацией, будут установлены и доступны и будут изолированы для сеанса пользователя так, как вы хотите.
Написание собственного провайдера - это не маленькое подвиг, но это выполнимо, и вы сможете повторно использовать большую часть логики и кода, которые вы в настоящее время используете для своих классов.
Попытка полностью переписать механизм аутентификации будет прыгать через болезненные, сложные обходы.
Некоторые ссылки:http://www.devx.com/asp/Article/29256/0/page/3http://www.codeproject.com/KB/aspnet/WSSecurityProvider.aspxhttp://msdn.microsoft.com/en-us/library/f1kyba5e%28v=VS.90%29.aspx
Свойства, которые вы должны реализовать, могут выглядеть пугающими, но если вам не нужны определенные функции (например, ResetPassword), вы можете просто выбросить NotImplementedException
.Кодируйте только то, что вы будете использовать.