Sitecore аутентифицирует пользователей по внешней базе данных о членстве - PullRequest
9 голосов
/ 04 августа 2011

У меня есть сайт Sitecore, на котором я хочу, чтобы учетные записи посетителей сайта сохранялись во внешней базе данных членства asp.net, но управляли редакторами / администраторами контента Sitecore через интерфейс Sitecore (и, следовательно, сохраняли в базе данных 'Core').

Я прочитал следующее сообщение на форуме http://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?postid=35305

, в котором упоминаются следующие документы http://sdn.sitecore.net/upload/sitecore6/62/membership_providers_sc62-a4.pdf http://sdn.sitecore.net/upload/sitecore6/62/security_api_cookbook_sc60-62-a4.pdf http://sdn.sitecore.net/upload/sdn5/modules/ad/low-level_sitecore_cms_security_and_custom_providers-a4.pdf

но ни один из них, кажется, не дает полной картины того, что мне нужно сделать.

В настоящее время у меня есть раздел <membership>, настроенный для использования поставщика 'switcher' (с указанием соответствующего поставщикав мою базу данных членства) и раздел <roleManager> также настроен на повторное использование поставщика коммутатора с соответствующим поставщиком, указывающим на указанную базу данных членства.

До сих пор мне удалось только сломать диспетчер пользователей в Sitecoreрабочий стол (выдает исключение Item has already been added. Key in dictionary: 'extranet\Anonymous' Key being added: 'extranet\Anonymous', если Sitecore создал учетную запись экстрасети \ Anonymous, или Object reference not set to an instance of an object., если я удалил этого пользователянт.

В качестве справочной информации я использую Sitecore 6.5, и соответствующий раздел моей веб-конфигурации выглядит следующим образом:

<membership defaultProvider="switcher">
  <providers>
    <clear/>
    <add name="sitecore"
         type="Sitecore.Security.SitecoreMembershipProvider, Sitecore.Kernel"
         realProviderName="myProvider"
         providerWildcard="%"
         raiseEvents="true"/>
    <add name="sql"
         type="System.Web.Security.SqlMembershipProvider"
         connectionStringName="core"
         applicationName="sitecore"
         minRequiredPasswordLength="1"
         minRequiredNonalphanumericCharacters="0"
         requiresQuestionAndAnswer="false"
         requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="256"/>
    <add name="switcher"
         type="Sitecore.Security.SwitchingMembershipProvider, Sitecore.Kernel"
         applicationName="sitecore"
         mappings="switchingProviders/membership"/>
    <add name="myProvider"
         type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         applicationName="sitecore"
         connectionStringName="myDatabase"
         minRequiredPasswordLength="1"
         minRequiredNonalphanumericCharacters="0"
         requiresQuestionAndAnswer="false"
         requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="10" />
  </providers>
</membership>
<roleManager defaultProvider="switcher" enabled="true">
  <providers>
    <clear/>
    <add name="sitecore" 
         type="Sitecore.Security.SitecoreRoleProvider, Sitecore.Kernel"
         realProviderName="myProvider"
         raiseEvents="true"/>
    <add name="sql"
         type="System.Web.Security.SqlRoleProvider"
         connectionStringName="core"
         applicationName="sitecore"/>
    <add name="switcher"
         type="Sitecore.Security.SwitchingRoleProvider, Sitecore.Kernel"
         applicationName="sitecore"
         mappings="switchingProviders/roleManager"/>
    <add name="myProvider"
         type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         applicationName="sitecore"
         connectionStringName="myDatabase" />
  </providers>
</roleManager>

1 Ответ

20 голосов
/ 05 августа 2011

Идея, которой вы должны следовать в случае пользовательских провайдеров членства / роли, аналогична той, которую AD модуль перечисляет в его инструкции по установке . Весь процесс можно разбить на несколько этапов:

  • Добавление строки подключения в connectionstrings.config
  • Добавление определений членства / поставщика ролей в раздел system.web файла web.config
  • Активация переключателей
  • Создание нового домена для пользователей / ролей из настраиваемого поставщика
  • Добавление сопоставлений доменов / провайдеров

Добавление строки подключения

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

Добавление определений участника / поставщика ролей

Еще один простой шаг - просто добавьте определение поставщика членства (myProvider в вашем случае) в разделе system.web/membership/providers в web.config и добавьте определение поставщика роли в разделе system.web/roleManager/providers. Порядок не важен. На этом этапе вы не изменяете никакие другие определения поставщиков в упомянутых разделах.

Активация переключателей

Это где это становится сложным. Прежде всего, НЕ ИЗМЕНЯЙТЕ значение атрибута @defaultProvider. По умолчанию это 'sitecore' и должно оставаться как есть. Вместо этого найдите поставщика с именем "sitecore" и измените его значение атрибута @realProviderName с 'sql' на 'switcher'.

Поставщик с именем "switcher" отвечает за всю магию, стоящую за переключением поставщиков и объединением результатов методов GetAll / Find.

Создать новый домен

Вам следует создать новый домен для пользователей / ролей, которые вы будете брать из своей пользовательской БД через своих пользовательских провайдеров. Примерно так:

   <domain name="myDomain" ensureAnonymousUser="false"/>

Если для атрибута @ensureAnonymousUser установлено значение false, Sitecore не добавит анонимного пользователя в ваш домен, поэтому myDomain\Anonymous не будет. Это обычно желаемое поведение для пользовательских доменов.

Добавление сопоставлений доменов / провайдеров

Это последний шаг, чтобы Sitecore знал, какой домен обслуживается у каждого провайдера. Один провайдер может обрабатывать несколько доменов (по умолчанию поставщик SQL Sitecore хранит пользователей из доменов 'sitecore' и 'extranet'), но не наоборот.

Итак, откройте основной файл web.config и перейдите в раздел configuration/sitecore/switchingProviders. Добавьте что-то вроде этого в подраздел членства:

<provider providerName="myProvider" storeFullNames="false" wildcard="%" 
domains="myDomain" />

и аналогичные вещи для подраздела roleManager:

<provider providerName="myProvider" storeFullNames="false" wildcard="%" 
domains="myDomain" />

После этого пользователи из вашей БД будут отображаться как 'myDomain\user' в UserManager, то же самое верно и для ролей. @storeFullNames='false' означает, что ваша БД хранит пользователей / роли без доменных префиксов, только локальные имена. Подстановочный знак должен быть значением по умолчанию в случае, если ваш пользовательский источник - SQL (который, очевидно, является).

Вот и все, и теперь это должно работать! :-) Подробности описанных выше шагов описаны в этой статье .

...