Разница между http.context.user и thread.currentprincipal и когда их использовать?

Я только недавно столкнулся с проблемой запуска веб-приложения asp.net в Visual Studio 2008. Я получаю сообщение об ошибке "тип не разрешен для member... customUserPrincipal". При отслеживании различных групп обсуждений кажется, что существует проблема с веб-сервером Visual Studio, когда вы назначаете настраиваемого участника для Thread.CurrentPrincipal.

В моем коде я сейчас использую...

HttpContext.Current.User = myCustomPrincipal
//Thread.CurrentPrincipal = myCustomPrincipal

Я рад, что мне удалось избежать ошибки, но напрашивается вопрос: "В чем разница между этими двумя методами установки принципала?". Существуют и другие вопросы о переполнении стека, связанные с различиями, но они не затрагивают детали двух подходов.

Я нашел один увлекательный пост, в котором был следующий грандиозный комментарий, но не было объяснений, подтверждающего его утверждения...

Используйте HttpConext.Current.User для всех веб-приложений (ASPX/ASMX).

Используйте Thread.CurrentPrincipal для всех других приложений, таких как winForms, консольные приложения и приложения-службы Windows.

Может кто-нибудь из вас, гуру безопасности /dot.net, пролить свет на эту тему?

3 ответа

Решение

Я считаю, что под веб-приложением Thread.CurrentPrincipal будет основным для тех, кто запускает рабочий процесс (поток).

HttpContext.Current.User будет текущим вошедшим в систему веб-пользователем.

В случае приложения forms/wpf это имеет смысл, потому что пользователь, под которым вы запускаете приложение, является тем, кто вас интересует.

Вы пытаетесь замаскировать рабочий процесс или вошедшего в систему пользователя?

Первое, что делает объект HttpApplication, когда он получает поток, - это устанавливает принципала потока равным принципалу HttpContext. Это синхронизирует принципы.

Однако, если вы перейдете к настройке участника Thread позже, у HttpApplication внутри все еще будет другой набор участников для пользовательского контекста. Вот почему вы всегда должны устанавливать его через HttpContext.

(Если вы посмотрите на Reflector, вы увидите сложный код, который выполняется, когда вы выполняете "set" в HttpContext.User - он выполняет много внутренних операций с IIS для правильной установки принципала.)

Эта статья объясняет это?
http://www.hanselman.com/blog/CommentView.aspx?guid=22c42b73-4004-40ce-8af9-47f1b9b434ed

Вот выдержка:

У меня есть некоторый код в пользовательской регистрации FormsAuthentication ASP.NET, который выглядит примерно так:

// This principal will flow throughout the request.
VoyagerPrincipal principal = new VoyagerPrincipal(yada, yada, yada);

// Attach the new principal object to the current HttpContext object
HttpContext.Current.User = principal;

Он вызвал запрос AuthenticateRequest от Global.asax, чтобы все было настроено до того, как сработают события страницы. Он предоставляет собственный IPrincipal, который интегрирует наш eFinance Server с ASP.NET. Это довольно симпатичная подсистема, ИМХО.

Другие операции рассчитывают на возможность в любой момент получить этот IP-принцип 'Call Context' из текущего потока. В другом разделе кода кто-то делал это в MIDDLE HttpRequest (где-то в Page_Load) после того, как JUST впервые вызвал приведенную выше подпрограмму:

return Thread.CurrentPrincipal as VoyagerPrincipal;

В случае, когда кто-то вызывает первый кусок кода, а затем ожидает, что сможет вызвать второй кусок в том же HttpRequest, Thread.CurrentPrincipal содержит GenericPrincipal, заполненный намного раньше HttpApplication. (Или WindowsPrincipal, в зависимости от ваших настроек).

Другие вопросы по тегам