2009-07-18 5 views
3

Моя проблема довольно проста - я думаю. Я выполняю проект ASP.NET MVC. Это проект, который требует, чтобы пользователь вошел в систему в любое время. Мне, вероятно, нужна информация текущего пользователя в MasterPage, например; «Привет, Марк, ты вошел!».Извлечь пользовательские данные по каждому запросу

Но что делать, если мне нужна такая же информация в представлении? Или какая-то проверка в моем servicelayer?

Итак, как убедиться, что эта информация доступна, когда она мне нужна, и где она мне нужна?

ответ

2

Какая информация о пользователе вам нужна? Вы всегда можете получить доступ к Thread.Current.Principal и получить имя пользователя - и, возможно, использовать его для поиска дополнительной информации о пользователе в базе данных.

Если вы действительно действительно нуждаетесь в какой-то информации в любое время, вы можете реализовать свой собственный основной принцип, исходящий из IPrincipal (это действительно неважно!), И добавьте туда эти биты информации и когда пользователь входит в систему, создает экземпляр MyCustomPrincipal и присоединяет его к текущему потоку. Тогда он будет доступен везде, везде и в любое время.

Марк

1

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

Мы только что установили BaseController, который обрабатывает информацию о том, что информация всегда задана и правильна для каждого вида. В зависимости от того, как вы обрабатываете аутентификацию и т. Д., Вы всегда будете иметь некоторые пользовательские данные в HttpContext.User.Identity.Name. На что также можно ссылаться.

0

Создайте иерархию своих моделей и поместите общую информацию в базовую модель. Таким образом, он будет доступен для любого вида или частичного просмотра.

Конечно, он должен быть получен по каждому запросу, поскольку веб-приложения не являются постоянными.

0

Вы должны сохранить это в сеансе и получить его в своих контроллерах через пользовательский ModelBinder.

+0

Единственная проблема, с которой у нас возникли проблемы с использованием сеанса, - это данные, которые могут различаться в зависимости от области вашего сайта. Например, у нас есть серия Лиги в одном из наших приложений, где иногда пользователь может быть менеджером, иногда нет. Нам нужно сохранить, управляет ли пользователь в сеансе. Это отлично работает, пока вы не открываете несколько вкладок, а затем все начинает становиться очень грязным. Таким образом, он работает для входа в систему, но падает, когда вы начнете использовать его для других данных потенциально. – pauldunlop

+0

Можете ли вы объяснить эту часть своей проблемы более подробно? Это звучит так, как будто вы хотите посмотреть на федерацию своей модели входа, используя роли в большей степени. –

+0

Это не совсем так, у нас есть один пользователь, который может иметь несколько ролей в разных элементах сайта. Предложение marc_s ниже может действительно решить эту проблему для нас. У нас есть игра с ним еще немного, чтобы понять, обеспечивает ли она хорошее решение. – pauldunlop

0

Не уверен, что, если я получаю то, что вы хотите спросить, но если вы ищете вещи, как аутентификация и на основе ролей разрешения, на самом деле ASP.net обеспечивает большую основу для работы над/начать с ,

Этот article (вместе с 2-й частью) - это то, что я недавно обнаружил и прочитал о том, что действительно хорошо начать с шаблона поставщика, который помогает понять базовую структуру аутентификации ASP.net. Обязательно прочтите также класс membershipProvider и класс RoleProvider в msdn, они вместе создают отличную основу для большинства базовых аутентификаций на основе ролей для работы (если вам удобна функция, которую они предоставили, вам даже не нужно код доступа к данным, все они представлены в реализации по умолчанию!)

PS: Проверьте свойство Context.Users тоже! Он сохраняет текущую аутентифицированную информацию пользователя.

0

HttpContext.Current.Users.Identity возвращает текущую информацию пользователя. Хотя я не уверен, будет ли он передаваться неявно, когда вы совершаете вызов webservice.

Смежные вопросы