Пользовательский профиль Sitecore - где он хранится, как его можно запросить
Я создал настраиваемый шаблон профиля пользователя и объект в базовой базе данных в Sitecore (согласно Поваренной книге Security API).
Я могу выбрать это программно (в соответствии с Поваренной книгой безопасности API), чтобы мои пользователи экстрасети имели расширенный профиль, который охватывает всех обычных подозреваемых (адрес, телефон, формат электронной почты и т.д.).
Однако, где хранятся эти данные? И как мне получить доступ к нему, если я хочу запросить базу данных, чтобы вернуть подмножество пользователей на основе данных этого профиля.
Типичным требованием для системы членов экстрасети является извлечение списка пользователей для связи либо в электронной почте, либо в кампании типа телефона. Можно ли это сделать с помощью системы членства Sitecore?
UPDATE >
Я собираюсь догадаться и сказать, что данные профиля хранятся в файле aspnet_Profile.PropertyValuesBinary.., который бы приблизил его к невозможности запроса и не соответствовал моей цели. Это несчастливо. Поэтому, чтобы расширить мой вопрос, если это так, возможно ли получить Sitecore для хранения этих значений в текстовом поле, чтобы они были доступны для поиска?
Ответы
Ответ 1
Стандартная реализация Microsoft SqlProfileProvider (которая используется по умолчанию в Sitecore) хранит информацию профиля пользователя в таблице aspnet_Profile. Все свойства сериализуются в столбцах PropertyNames/PropertyValuesString. Свойство PropertyValuesBinary используется для хранения двоичных данных (изображений). Вы можете найти более подробную информацию, если вы посмотрите на код метода System.Web.Profile.SqlProfileProvider, SetPropertyValues.
Затем все пользовательские свойства, которые вы определяете в профиле пользователя, сериализуются в свойстве SerializedData класса Profile и снова сериализуются в столбцы PropertyNames/PropertyValuesString, как и любое другое свойство.
Кроме того, пара свойств хранится в таблице aspnet_Membership (по некоторым причинам) - электронная почта и комментарий.
Итак, если вы собираетесь запрашивать пользователей по электронной почте, вы можете использовать метод FindUsersByEmail для MembershipProvider. В противном случае, если вы планируете фильтровать другое значение свойства, я полагаю, вам придется получить всех пользователей и фильтровать полученную коллекцию.
Надеюсь, что это поможет.
Ответ 2
Я столкнулся с этой точной проблемой на прошлой неделе, не придумал постоянного решения, но для решения моей конкретной проблемы я написал небольшую вспомогательную страницу и добавил ее как приложение Sitecore для доступа к интерфейсу CMS. Все, что он делал, было запросом всех пользователей и определить, были ли у них какие-либо свойства 5-6 свойств профиля.
var userList = Sitecore.Security.Accounts.UserManager.GetUsers();
Это соответствующая строка для захвата пользователей, она возвращает Sitecore.Common.IFilterable
Итак, если вам нужно что-то делать, когда вы захватываете информацию профиля от всех пользователей, вы можете сделать что-то вроде этого:
foreach (Sitecore.Security.Accounts.User user in userList)
{
Sitecore.Security.UserProfile profile = user.Profile;
string whatever = profile["Whatever"];
//add whatever to a list or something
}
Это было очень хорошо для моих целей, но я не знаю, насколько это возможно в вашей ситуации.