Обход страницы выбора нескольких поставщиков системы проверки подлинности в SharePoint 2010

Исходная статья опубликована в воскресенье 1 мая 2011 г.

ПРИМЕЧАНИЕ.   В очередной раз надо отдать должное потрясающим специалистам, обеспечивающим работу этого сайта. Эта последняя версия теперь поддерживает еще МЕНЬШИЙ объем форматирования Word и Visual Studio, чем раньше! Я думал, что невозможно сделать этот сайт хуже, чем он уже есть, однако вам, ребята, удалось превзойти — я бы даже сказал, сокрушить — мои ожидания. Поздравляю! Вскоре я и сам, вероятно, последую благому примеру и откажусь от использования Word, Excel и PowerPoint в пользу блокнота — кому, в конце концов, вообще нужно это форматирование?

Недавно мне пришлось выполнять обход страницы выбора поставщиков, на которую вы попадаете, если включено несколько поставщиков системы проверки подлинности в одной зоне SharePoint 2010.  Я использовал сравнительно простой сценарий, однако, можно воспользоваться расширенной методикой в целях поддержки значительно более сложных сценариев.  В моем случае использовалась проверка подлинности Windows и проверка подлинности на основе форм, включенная для зоны.  Тем не менее мне всегда хотелось, чтобы пользователи для этого конкретного сценария использовали проверку подлинности на основе форм.

Добиться этого оказалось сравнительно просто. Для этого потребовалось выполнить следующие действия:

  1. СОЗДАЙТЕ РЕЗЕРВНУЮ КОПИЮ файла default.aspx в папке C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN.
  2. Откройте Visual Studio и создайте  новый проект библиотеки классов Windows.
  3. Добавьте ссылки на файлы System.Web, Microsoft.SharePoint.dll и Microsoft.SharePoint.IdentityModel.dll.  К сожалению модель удостоверения доступна только в глобальном кэше сборок, поэтому для добавления ссылки мне пришлось получить копию модели и поместить ее в корневой каталог на диске.  Рекомендации по поиску и копированию модели см. в моей записи блога с описанием соответствующей процедуры по адресу:  http://blogs.technet.com/b/speschka/archive/2010/07/21/writing-a-custom-forms-login-page-for-sharepoint-2010-part-1.aspx.  
  4. Присвойте сборке строгое имя, поскольку она будет помещена в глобальный кэш сборок.
  5. Добавьте новую страницу ASPX в проект.  Честно говоря, мне кажется, что проще всего было бы скопировать страницу из существующего проекта веб-приложения ASP.NET; таким образом вы сможете скопировать сразу все файлы ASPX, ASPX.CS и ASPX.DESIGNER.CS.  Обратите внимание, что в этом случае требуется файл с именем "default.aspx"; при этом отсутствие в этом файле записанного кода и наличие минимальной разметки на странице существенно упростит дело.
  6. В файле фонового кода (файл с расширением ASPX.CS) измените пространство имен в соответствии с пространством имен текущего проекта.
  7. Измените класс, чтобы он наследовал от Microsoft.SharePoint.IdentityModel.Pages.MultiLogonPage.
  8. Переопределите событие OnLoad.  Когда пользователи попадают на сайт, для которого включено несколько поставщиков систем проверки подлинности, они сначала перенаправляются на страницу /_login/default.aspx (которая описана в разделе № 1 выше).  На этой странице пользователь может выбрать поставщика проверки подлинности, после чего он будет перенаправлен на нужную страницу для выполнения проверки подлинности.  Как я уже говорил, в этом сценарии хотелось бы, чтобы пользователи выполняли проверку подлинности на основе форм, поэтому я всегда настраиваю переадресацию пользователей на страницу /_forms/default.aspx.  По завершении стандартной процедуры входа вы переходите на страницу /_login/default.aspx, где выбираете поставщика проверки подлинности, выполняете обратную передачу записи на страницу /_login/default.aspx, после чего выполняется переадресация уже на правильную страницу входа.  Так что в этом случае меня мало интересует, выполняется ли обратная передача моей страницы входа .  Если нет, это говорит о том, что поставщик проверки подлинности еще не выбран.  Поэтому я просто перечисляю все значения строки запроса и добавляю их на страницу /_forms/default.aspx, куда впоследствии переадресуется пользователь.  Вот так выглядит весь фрагмент кода:

protected override void OnLoad(EventArgs e)

{

   base.OnLoad(e);

 

   try

   {

       //если обратная передача не выполняется, это означает, что пользователь не выбрал

       //службу проверки подлинности, которую следует использовать

       //в этом случае мы рекомендуем пользователю выполнять вход с использованием проверки подлинности на основе форм

       if (!this.IsPostBack)

       {

          //получение всех параметров строки запроса

          System.Text.StringBuilder qp = new System.Text.StringBuilder(2048);

 

          foreach (ключ строки в this.Request.QueryString.Keys)

          {

             qp.Append(key + "=" + this.Request.QueryString[key] + "&");

          }

 

          //переадресация на страницу входа с проверкой подлинности на основе форм

          this.Response.Redirect("/_forms/default.aspx?" + qp.ToString());

       }

   }

   catch (Exception ex)

   {

       Debug.WriteLine(ex.Message);

   }

}

  1. Теперь необходимо выполнить компиляцию приложения, чтобы получить строгое имя приложения и добавить его в разметку файла default.aspx.
  2. Вставьте следующий код в файл default.aspx — потребуется просто изменить класс, от которого наследует страница (выделен ниже). Обратите внимание, что я всего лишь скопировал код из /_login/default.aspx заменил значение Inherits данными своего пользовательского класса:

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" Inherits="MultiAuthLoginPage._Default,MultiAuthLoginPage, Version=1.0.0.0, Culture=neutral, PublicKeyToken=907bf41ebba93579" MasterPageFile="~/_layouts/simple.master" %>

<%@ Assembly Name="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register Tagprefix="SharepointIdentity" Namespace="Microsoft.SharePoint.IdentityModel" Assembly="Microsoft.SharePoint.IdentityModel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%>

<%@ Import Namespace="Microsoft.SharePoint.WebControls" %>

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Import Namespace="Microsoft.SharePoint" %>

<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ID="Content1" ContentPlaceHolderId="PlaceHolderPageTitle" runat="server">

                <SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitle" />

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderId="PlaceHolderPageTitleInTitleArea" runat="server">

                <SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageTitleInTitleArea" />

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderId="PlaceHolderSiteName" runat="server"/>

<asp:Content ID="Content4" ContentPlaceHolderId="PlaceHolderMain" runat="server">

<SharePoint:EncodedLiteral runat="server"  EncodeMethod="HtmlEncode" Id="ClaimsLogonPageMessage" />

<br />

<br />

<SharepointIdentity:LogonSelector ID="ClaimsLogonSelector" runat="server" />

</asp:Content> 

  1. Зарегистрируйте свою сборку в глобальном кэше сборок.
  2. Скопируйте новую пользовательскую страницу default.aspx в папку C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IDENTITYMODEL\LOGIN.  НЕ ЗАБУДЬТЕ ПЕРЕД ЭТИМ СОЗДАТЬ РЕЗЕРВНУЮ КОПИЮ ИСХОДНОГО ФАЙЛА!
  3. Выполните шаги 1, 11 и 12 для каждого веб-интерфейса в ферме.

Вот и все.  Я протестировал эту процедуру для стандартного входа пользователя на сайт, а также для открытия документов непосредственно из клиентов Microsoft Office 2010.  Следует отметить еще кое-что:  в результате изменяется поведение ВСЕХ веб-приложений в ферме!  Опять-таки, именно поэтому данный пример считается простым.  Тем не менее вы можете просмотреть имя узла для запроса (сопоставляемого с веб-приложением) и выбрать другой способ проверки подлинности в зависимости от того, к каким веб-приложениям или даже семействам сайтов осуществляется доступ.  Изменить способ проверки подлинности также можно с учетом данных о текущем пользователе.  Классы HttpRequest.Context.Current, Page.Request и Page.Response предоставляют достаточно данных, что позволяет принимать решение в каждом конкретном случае.

 

Это локализованная запись блога. Исходная статья находится по адресу Bypassing the Multi Authentication Provider Selection Page in SharePoint 2010