Sharepoint и FBA: создание пользователей из PowerShell. Часть 1

Я уже давно работаю с Sharepoint, приличное время с PowerShell. И вот недавно мне поставили задачу – перевести функционал сайта, сделанного в 1С:Битрикс на WSS. Всё было просто, пока мы не дошли до стадии создания логинов на сайте.

Т.к. сайт предназначался для доступа из вне, естественным было использовать FBA в Sharepoint – Form Based Authentication. Встала необходимость создать порядка 50 пользователей, список которых был выгружен из 1С:Битрикс. Создание пользователей для Sharepoint  в обычной среде (с доменом и авторизацией в AD)  проблемой не является. Но, как оказалось, с FBA всё сильно сложнее.

Я не буду останавливаться на процессе собственно включения FBA в Sharepoint, благо про это написано не одна статья. В итоге у нас должен появиться свой собственный провайдер аутентификации и RoleManagement-а. Итак, процесс создания пользователя в общих чертах выглядит следующих образом:

  1. Создать пользователя в нашем провайдере аутентификации. Для этого нам надо указать логин, пароль, и электронную почту (в зависимости от настроек провайдера может потребоваться также подстановка контрольного вопроса и ответа). После этого пользователь будет создан в БД.
  2. Включить пользователя в Sharepoint, и добавить его в необходимую группу.

Этап первый.

Для создания пользователей в провайдере используется пространство имен [System.Web.Security]. В данном пространстве есть класс [System.Web.Security.MembershipProvider], экземпляры которого содержит в себе несколько методов для работы с пользователями, в том числе метод CreateUser, который нам и нужен.

Собственно код для создания пользователя в провайдере достаточно прост:

   1: [System.Reflection.Assembly]::LoadWithPartialName("System.Web")  | Out-Null
   2: $provider = [System.Web.Security.Membership]::Providers["CustomSqlMembershipProvider"]
   3: $login = "TestLogin"
   4: $password = "Secure1_Password"
   5: $mail = "test@mail.local"
   6: $question = "q"
   7: $answer = "a"
   8: $approved = $true
   9: $provider.CreateUser($login, $password, $mail, $question, $answer, $approved, $null, [ref]$status)

На вид – ничего сложного. Но когда вы запустите этот код, ваш созданный ранее провайдер не будет найден. Дело всё в том, что пространство имен [System.Web.Security] рассчитано на то, что все его классы будут использоваться внутри веб-сервера, и как следствие иметь доступ к настройках текущего узла. Точно также работает и класс [System.Web.Security.MembershipProvider] – вызов свойства [System.Web.Security.MembershipProvider]::Providers в свою очередь вызывает внутренние методы, которые обращаются к файлу настроек веб-сервера (а точнее, что важно как вы увидите потом – к файлу настроек приложения веб-вервера). Все настройки веб-севрера IIS хранятся в файле c:\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config. Там же, в секции <configuration><roleManager> хранится и созданный провайдер. Логично, PowerShell вообще ничего не знает об этом файле настроек и не умеет его использовать.

Вот тут проявляется вся сила и простота .NET Framework. Всё, что нам нужно сделать – создать файл настроек (.config) для PowerShell. Для этого достаточно каталоге с файлом powershell.exe (или powershell_ise.exe, в зависимости от того, чем вы пользуетесь) создать одноименный файл powershell.config и\или powershell_ise.config со следующим шаблоном:

   1: <?xml version ="1.0"?>
   2: <configuration>
   3:   <system.web>
   4:   </system.web>
   5: </configuration>

После этого внутрь секции syste.web скопировать секции <roleManager> и <membership> из web.config, а также вставить после секции </system.web> секцию <connectionStrings> из того же web.config. В итоге у вас должно получиться примерно следующее:

   1: <?xml version ="1.0"?>
   2: <configuration>
   3:  <system.web>
   4:   <roleManager>
   5:    <providers>
   6:     <add name="CustomSqlRoleprovider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" applicationName="/" connectionStringName="LocalSqlServer" />
   7:    </providers>
   8:   </roleManager>
   9:   <membership>
  10:     <providers>
  11:       <add name="CustomSQLMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" applicationName="/" connectionStringName="LocalSqlServer" enablePasswordReset="true" enablePasswordRetrieval="false" passwordFormat="Hashed" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" minRequiredNonalphanumericCharacters="1" minRequiredPasswordLength="8" />
  12:     </providers>
  13:   </membership>
  14:  </system.web>
  15:  <connectionStrings>
  16:    <remove name="LocalSqlServer" />
  17:    <add connectionString="Server=localhost;Database=FormAuthDB;Integrated Security=true" name="LocalSqlServer" providerName="System.Data.SqlClient" />
  18:  </connectionStrings>
  19: </configuration>

После этого, если вы запустите тот же самый скрипт – он должен отработать корректно.

Реклама

2 Responses to Sharepoint и FBA: создание пользователей из PowerShell. Часть 1

  1. Denis says:

    Привет! Познавательный разбор полётов :) К этой же теме, может пригодиться пост (http://blogs.msdn.com/b/serpo_msdn/archive/2009/02/12/9414339.aspx ) в самом низу. + хотел спросить, ради интереса ) почему выбрал этот путь, а не более простой ADAM?

  2. Anton says:

    сервер полностью изолирован. поэтому и ФБА.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: