Можно ли выполнить явленный олицетворением поиск в SharePoint, не обеспечивая пароль?

  1. да
  2. да
  3. любопытство, поиск лучших языков и т. Д. (На самом деле, я выучил их несколько параллельно много лет назад)
  4. да, если проект требует этого явно

заявление об отказе от ответственности: я никогда действительно не перешел из php.

6
задан Kirk Liemohn 22 June 2009 в 03:53
поделиться

2 ответа

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

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

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

1
ответ дан 17 December 2019 в 04:51
поделиться

Для этого вам потребуется настоящее олицетворение 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);
}
4
ответ дан 17 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: