Можете ли вы выполнить олицетворенный поиск в SharePoint без ввода пароля? - PullRequest
6 голосов
/ 22 июня 2009

В прошлом я довольно долго делал олицетворение в SharePoint, выполняя что-то вроде следующего.

SPWeb web = SPContext.Current.Web;
string currentWebUrl = web.Url;
SPUser user = web.EnsureUser(loginToImpersonate);
using (SPSite site = new SPSite(currentWebUrl, user.UserToken)
{
    using (SPWeb impersonatedWeb = site.OpenWeb())
    {
        // Any SharePoint access here to 'impersonatedWeb'
        // is impersonated as 'loginToImpersonate'
    }
}

Обратите внимание, что для этого не требуется пароль пользователя, которого вы олицетворяете, но для его запуска требуется определенная защита доступа к коду. В качестве примечания, вызов EnsureUser также требует, чтобы текущий пользователь был администратором, но есть другие методы, которые могут использоваться вместо EnsureUser для получения объекта SPUser (пытаясь сохранить фрагмент моего кода простым для этого вопроса).

Теперь, когда я подготовил почву ... Теперь я хочу сделать FullTextSQLQuery или KeywordQuery для обработчика запросов MOSS или WSS и получить урезанные по безопасности результаты, основанные на подражаемом пользователе. Оба объекта могут использовать SPSite для конструктора, но игнорировать мою логику олицетворения. Вместо этого они идут с зарегистрированным пользователем (HTTPContext.Current.User).

Есть и другие конструкторы: имя приложения (строка), а для MOSS есть один с ServerContext для SSP, но я не думаю, что это поможет вообще.

Я использовал Reflector для класса KeywordQuery и его базового класса Query, и он становится довольно уродливым и быстрым. Я полагаю, что реальная логика, которая определяет пользователя, находится в неуправляемом коде.

Итак, могу ли я это сделать?

Ответы [ 3 ]

4 голосов
/ 22 июня 2009

Для этого вам нужно настоящее олицетворение Windows. Олицетворение SPSite не является настоящим олицетворением - оно просто говорит объектной модели WSS записать другой идентификатор пользователя в созданные и измененные поля в базе данных контента.

Для олицетворения Windows вам, к сожалению, потребуются как логин, так и пароль, если вы не хотите олицетворять учетную запись пула приложений, используя SPSecurity.RunWithElevatedPrivileges

Вы можете реализовать олицетворение Windows следующим образом:

using (Impersonator imp = new Impersonator("user", "domain", "password"))
{
  // Do stuff impersonated
}

где класс Impersonator реализован как:

public sealed class Impersonator : IDisposable
{
  private WindowsImpersonationContext impersonationContext;

  public Impersonator(string user, string domain, string password)
  {
    WindowsIdentity id = Logon(user, domain, password);
    impersonationContext = id.Impersonate();
  }

  public void Dispose()
  {
    if (impersonationContext != null)
    {
      impersonationContext.Undo();
      impersonationContext = null;
    }
  }

  private WindowsIdentity Logon(string user, string domain, string password)
  {
    WindowsIdentity identity;
    IntPtr handle = IntPtr.Zero;
    bool logonSucceeded = LogonUser(
      user, domain, password,
      8,   // LOGON32_LOGON_NETWORK_CLEARTEXT
      0,   // LOGON32_PROVIDER_DEFAULT
      ref handle);

    if (!logonSucceeded)
    {
      int errorCode = Marshal.GetLastWin32Error();
      throw new UnauthorizedAccessException("User logon failed. Error Number: " + errorCode);
    }

    identity = new WindowsIdentity(handle);
    CloseHandle(handle);

    return identity;
  }

  [DllImport("advapi32.dll", SetLastError = true)]
  private static extern bool LogonUser(string lpszUsername,
    string lpszDomain,
    string lpszPassword,
    int dwLogonType,
    int dwLogonProvider,
    ref IntPtr phToken);

  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  private static extern bool CloseHandle(IntPtr handle);
}
1 голос
/ 21 июня 2010

Оказывается, вы можете выполнять олицетворенный поиск в SharePoint без пароля. Мы выяснили это еще в августе 2009 года, и я был упущен в обновлении Stack Overflow с ответом.

Подробнее см. http://wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identities и обратите особое внимание на особые требования. Обратите внимание, что это работает как с SharePoint 2007, так и с SharePoint 2010.

Большое спасибо моему коллеге Эрику Боудену, который сделал всю работу!

0 голосов
/ 06 ноября 2013

На самом деле существует другой способ подражания при выполнении поиска с использованием объектной модели. Я смог заставить его работать, выполняя подражание при работе с повышенными привилегиями. см. мой пост здесь: http://vishalseth.com/post/2013/11/05/Impersonated-Searching-against-SharePoint.aspx

...