2009-06-22 4 views
6

Ich habe den Identitätswechsel in SharePoint in der Vergangenheit ziemlich durchgeführt, indem ich etwas wie das Folgende gemacht habe.Können Sie eine imitierte Suche in SharePoint durchführen, ohne ein Passwort anzugeben?

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 Nebenbemerkung erfordert der Aufruf von EnsureUser auch, dass der aktuelle Benutzer ein Administrator ist, aber es gibt andere Methoden, die anstelle von EnsureUser verwendet werden können, um das SPUser-Objekt abzurufen (versuche, mein Codefragment für diese Frage einfach zu halten).

Nun, da ich die Bühne eingerichtet habe ... Ich möchte jetzt entweder eine FullTextSQLQuery oder eine KeywordQuery entweder für die MOSS oder WSS-Abfrage-Engine tun und Sicherheits abgeschnittene Ergebnisse basierend auf einem imitierte Benutzer erhalten. Beide Objekte können eine SPSite für den Konstruktor übernehmen, ignorieren jedoch meine Identitätswechsellogik. Sie gehen stattdessen mit dem aktuell angemeldeten Benutzer (HTTPContext.Current.User).

Es gibt auch andere Konstruktoren: Anwendungsname (String) und für MOSS gibt es einen mit einem ServerContext zum SSP, aber ich denke nicht, dass diese überhaupt helfen werden.

Ich habe Reflector für die KeywordQuery-Klasse und ihre Basis-Query-Klasse verwendet und es wird ziemlich schnell ziemlich hässlich. Ich glaube, dass die tatsächliche Logik, die den Benutzer bestimmt, in nicht verwaltetem Code enthalten ist.

Also, ist es mir möglich, dies zu tun?

+0

Arbeitslink: http://www.threewill.com/2010/06/connect-to-sharepoint-forwarding-user-identities/ – KjellSj

Antwort

1

Es stellt sich heraus, dass Sie ca n imitiert Identität in SharePoint ohne ein Passwort. Wir haben das im August 2009 herausgefunden und ich habe es versäumt, Stack Overflow mit der Antwort zu aktualisieren.

Weitere Informationen finden Sie unter http://wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identities und achten Sie besonders auf die speziellen Anforderungen. Beachten Sie, dass dies sowohl mit SharePoint 2007 als auch mit SharePoint 2010 funktioniert.

Vielen Dank an meinen Kollegen Eric Bowden, der die ganze Arbeit geleistet hat!

+2

Erscheint der Link ist kaputt? –

+0

Arbeitslink: http://www.threewill.com/2010/06/connect-to-sharepoint-forwarding-user-identities/ –

+0

Vielen Dank, dass Sie den aktualisierten Link gefunden haben. Ich wusste nicht wo ich war! –

4

Sie benötigen dazu einen echten Windows-Identitätswechsel. Der SPSite-Identitätswechsel ist kein echter Identitätswechsel - er teilt dem WSS-Objektmodell lediglich mit, eine andere Benutzer-ID in die erstellten und geänderten Felder in der Inhaltsdatenbank zu schreiben.

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

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

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

wo die Impersonator Klasse ist implementiert als:

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

Danke, Lars. Nicht die Antwort, die ich natürlich hören wollte, aber es ist gut zu wissen, was meine Möglichkeiten sind. Ich schätze die Impersonator-Klasse. Das sieht gut aus. –

+0

Gute Sachen Lars, danke dafür. –

0

Es gibt tatsächlich eine andere Möglichkeit, Identitätswechsel durchzuführen, wenn Suchen mit dem Objektmodell durchgeführt werden. Ich konnte es zum Laufen bringen, indem ich mit erhöhten Rechten Pseudonym spiele. siehe meinen Beitrag hier: http://vishalseth.com/post/2013/11/05/Impersonated-Searching-against-SharePoint.aspx

+1

Während dieser Link die Frage beantworten kann, sollten Sie den Artikel zusammenfassen oder zitieren, da Links dazu neigen, im Laufe der Zeit zu verfallen. – pinckerman

Verwandte Themen