Пользовательский профиль 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
}

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