Können Sie eine imitierte Suche in Sharepoint, ohne ein Passwort Bereitstellung durchführen?

StackOverflow https://stackoverflow.com/questions/1025409

Frage

Ich habe in Sharepoint ziemlich viel in der Vergangenheit getan Identitätswechsel durch etwas wie die folgenden zu tun.

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'
    }
}

Beachten Sie, dass dies nicht das Kennwort des Benutzers erfordert Sie Identitätswechsel, aber bestimmte Codezugriffssicherheit zu laufen erfordert. Als Seite beachten auch der EnsureUser Aufruf die aktuellen Benutzer erfordert ein Admin zu sein, aber es gibt andere Methoden, die anstelle von EnsureUser verwendet werden können, das SPUser Objekt zu erhalten (versucht, mein Codefragment einfach für diese Frage zu halten).

Nun, da ich die Bühne habe ... Ich will jetzt entweder eine FullTextSQLQuery oder eine KeywordQuery entweder gegen die MOSS oder WSS-Abfrage-Engine tun und Sicherheitsergebnisse getrimmt auf einem imitierten Benutzer basieren bekommen. Beide Objekte können auf den Konstruktor ein SPSite nehmen, aber meine Identitätswechsel Logik ignorieren. Sie gehen mit der aktuell angemeldeten Benutzers statt (HttpContext.Current.User).

Es gibt auch andere Konstrukteure auch: Anwendungsnamen (string) und für MOSS gibt es noch einen mit einem Serverkontext an den SSP, aber ich glaube nicht, diese überhaupt helfen

.

Ich habe Reflektor auf der KeywordQuery Klasse und ihre Basis der Abfrageklasse verwendet, und es wird ziemlich hässlich ziemlich schnell. Ich glaube, die eigentliche Logik, die den Benutzer bestimmt ist unten in nicht verwalteten Code.

So ist es möglich für mich, dies zu tun?

War es hilfreich?

Lösung 2

Es stellt sich heraus, dass Sie kann ohne Passwort in Sharepoint imitierte Suche. Wir dachten, das im August 2009 aus, und ich habe bei der Aktualisierung der Stack-Überlauf mit der Antwort nachlässig gewesen.

Siehe http : //wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identities die Details für und besonderes Augenmerk auf die besonderen Anforderungen zu zahlen. Beachten Sie, dass dies mit funktioniert sowohl Sharepoint 2007 und Sharepoint 2010.

Vielen Dank an meine Mitarbeiter Eric Bowden, die die ganze Arbeit gemacht haben!

Andere Tipps

Sie müssen echte Windows-Identitätswechsel, dies zu tun. Der SPSite Identitätswechsel ist nicht real Identitätswechsel - es sagt nur das WSS-Objektmodell einer andere Benutzer-ID an die Erstellungs- und Änderungs Felder in der Inhaltsdatenbank zu schreiben.

Für Windows Identitätswechsel werden Sie leider müssen sowohl das Login und Passwort, wenn Sie das Anwendungspoolkonto mit SPSecurity.RunWithElevatedPrivileges

Sie können Windows-Identitätswechsel wie folgt implementieren:

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

, wo die Impersonator Klasse implementiert wie:

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);
}

Es ist eigentlich eine andere Art und Weise Identitätswechsel zu tun, wenn die Suche über das Objektmodell durchgeführt wird. Ich war in der Lage, um es, indem Sie den Identitätswechsel zu arbeiten, wenn mit erhöhten Privilegien ausgeführt wird. siehe meinen Beitrag hier: http://vishalseth.com/ Post / 2013/11/05 / imitierten-Searching-gegen-SharePoint.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top