2009-06-22 10 views
6

J'ai fait un peu usurpation d'identité dans SharePoint dans le passé en faisant quelque chose comme ce qui suit.Pouvez-vous effectuer une recherche avec emprunt d'identité dans SharePoint sans fournir de mot de passe?

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

Notez que cela ne nécessite pas le mot de passe de l'utilisateur que vous empruntez l'identité, mais ne nécessite certaine sécurité d'accès au code à exécuter. En remarque, l'appel EnsureUser requiert également que l'utilisateur actuel soit un administrateur, mais il existe d'autres méthodes qui peuvent être utilisées à la place de EnsureUser pour obtenir l'objet SPUser (en essayant de garder mon fragment de code simple pour cette question). Maintenant que j'ai défini la scène ... Je veux maintenant faire une requête FullTextSQLQuery ou une requête KeywordQuery contre le moteur de requête MOSS ou WSS et obtenir des résultats de sécurité en fonction d'un utilisateur emprunté. Les deux objets peuvent prendre un SPSite sur le constructeur, mais ignorer ma logique d'emprunt d'identité. Ils vont plutôt avec l'utilisateur actuellement connecté (HTTPContext.Current.User).

Il existe également d'autres constructeurs: nom de l'application (chaîne) et pour MOSS, il y en a un avec un ServerContext pour le SSP, mais je ne pense pas que cela puisse vraiment être utile.

J'ai utilisé Reflector sur la classe KeywordQuery et sa classe Query de base, ce qui est plutôt moche. Je crois que la logique réelle qui détermine l'utilisateur est en panne de code non géré.

Alors, est-ce que je peux le faire?

+0

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

Répondre

1

Il se trouve que vous ca n effectuer une recherche avec emprunt d'identité dans SharePoint sans mot de passe. Nous l'avons compris en août 2009 et j'ai négligé de mettre à jour Stack Overflow avec la réponse.

Voir http://wiki.threewill.com/display/is/2010/06/18/Connect+to+SharePoint+-+Forwarding+User+Identities pour les détails et porter une attention particulière aux exigences particulières. Notez que cela fonctionne avec SharePoint 2007 et SharePoint 2010.

Un grand merci à mon collègue Eric Bowden qui a fait tout le travail!

+2

Apparaît le lien est rompu? –

+0

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

+0

Merci d'avoir trouvé le lien mis à jour. Je ne savais pas où c'était moi-même! –

4

Pour ce faire, il vous faut une véritable usurpation d'identité Windows. L'emprunt d'identité SPSite n'est pas une usurpation d'identité réelle - il indique simplement au modèle d'objet WSS d'écrire un autre identifiant d'utilisateur dans les champs créés et modifiés de la base de données de contenu.

Pour Windows usurpation d'identité, vous aurez besoin, malheureusement, à la fois le login et le mot de passe, sauf si vous voulez usurper l'identité du compte du pool d'applications utilisant SPSecurity.RunWithElevatedPrivileges

Vous pouvez mettre en œuvre de Windows usurpation d'identité comme suit:

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

où la classe Imitateur est implémenté comme:

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

Merci, Lars. Pas la réponse que je voulais entendre, bien sûr, mais c'est bon de savoir quelles sont mes options. J'apprécie la classe Impersonator. Ça a l'air sympa. –

+0

Bonne affaire Lars, merci pour ça. –

0

Il existe en réalité une autre façon de faire l'usurpation d'identité lors de l'exécution de recherches à l'aide du modèle objet. J'ai été capable de le faire travailler en faisant l'usurpation d'identité en courant avec des privilèges élevés. voir mon article ici: http://vishalseth.com/post/2013/11/05/Impersonated-Searching-against-SharePoint.aspx

+1

Alors que ce lien peut répondre à la question, vous devriez résumer ou citer l'article parce que les liens ont tendance à se dégrader au fil du temps. – pinckerman

Questions connexes