Partager via


Utiliser un filtrage de sécurité personnalisé pour les résultats de recherche de SharePoint Server

Cette procédure vous guide tout au long des étapes d’implémentation (créer, déployer et inscrire) d’un découpage de sécurité personnalisé pour la recherche dans SharePoint à l’aide de Microsoft Visual Studio 2010.

La recherche dans SharePoint effectue un découpage de sécurité au moment de la requête des résultats de recherche. Toutefois, certains scénarios peuvent vous amener à privilégier un découpage de sécurité personnalisé. La recherche dans SharePoint prend en charge ces scénarios par le biais des interfaces Microsoft.Office.Server.Search.Query.ISecurityTrimmerPre , Microsoft.Office.Server.Search.Query.ISecurityTrimmerPost et ISecurityTrimmer2 (déconseillé) dans l’espace de noms Microsoft.Office.Server.Search.Query .

Il existe deux types de filtrage de sécurité personnalisé : filtrage préalables et postérieures raccordant. Filtrage préliminaire fait référence à une évaluation préliminaire de la requête où la requête est réécrite pour ajouter des informations sur la sécurité avant que la requête ne correspond à l'index de recherche. Après suppression fait référence à l'évaluation de la post-requête où les résultats de recherche sont nettoyés avant d'être renvoyés à l'utilisateur. Nous recommandons l'utilisation de filtrage préliminaire pour les performances et l'exactitude général ; après suppression empêche la fuite d'informations pour les instances de compteur d'accès et les données d'affinement.Le processus d'inscription découpage de sécurité vous permet de spécifier les propriétés de configuration pour le découpage de sécurité personnalisé.

Le découpage de sécurité personnalisé dans Recherche dans SharePoint 2013 se compose de deux interfaces qui peuvent être utilisés pour exécuter filtrage avant ou après suppression de vos résultats de recherche. Cette formation se concentre sur les deux interfaces, qui décrit les étapes nécessaires pour créer et enregistrer vos propres découpages de sécurité.

Vue d’ensemble

Le découpage de sécurité personnalisé dans la recherche dans SharePoint se compose de deux interfaces qui peuvent être utilisées pour effectuer le prédéfinissement ou le post-découpage de vos résultats de recherche. Cette procédure se concentre sur les deux interfaces, décrivant les étapes nécessaires pour créer et inscrire vos propres découpages de sécurité.

Configuration requise

Pour effectuer cette procédure, vous devez disposer les logiciels suivants sont installés dans votre environnement de développement :

  • Rechercher dans Microsoft SharePoint
  • Microsoft Visual Studio 2010 ou similaire Microsoft .NET Framework - outil de développement compatible

Configurer un projet de découpage de sécurité personnalisé

Dans cette étape, vous sera créer le projet de découpage de sécurité personnalisé, puis ajoutez les références requises pour le projet.

Pour créer le projet pour un découpage de sécurité personnalisé

  1. Ouvrez Visual Studio et choisissez fichier, Nouveau, projet.
  2. Dans types de projets, sous Visual C#, choisissez SharePoint.
  3. Sous modèles, sélectionnez Projet SharePoint vide. Dans le champ nom, tapez CustomSecurityTrimmerSample, puis cliquez sur le bouton OK.
  4. Dans l' Assistant Personnalisation de SharePoint, sélectionnez déployer en tant qu'une solution de batterie de serveurs, puis cliquez sur Terminer.

Pour ajouter des références au projet de découpage de sécurité personnalisé

  1. Dans le menu Projet, choisissez Ajouter une référence.

  2. Sous l'onglet .NET, sélectionnez les références avec les noms de composants suivants et puis cliquez sur le bouton OK:

    • Composant Microsoft Search

    Vous devriez voir deux entrées sous l'onglet .NET avec le nom du composant composant Microsoft Search. Sélectionnez l’entrée dans laquelle la colonne Chemin est \ISAPI\Microsoft.Office.Server.Search.dll. Si cette entrée est manquante dans l'onglet .NET de la boîte de dialogue Ajouter des références, vous devez ajouter la référence à partir de l'onglet Parcourir en utilisant le chemin d'accès Microsoft.Office.Server.Search.dll.

    • Microsoft.IdentityModel

    Si Microsoft.IdentityModel n'est pas répertorié sous l'onglet .NET, vous devez ajouter la référence à Microsoft.IdentityModel.dll à partir de l'onglet Parcourir, en utilisant le chemin d'accès suivant :

    %ProgramFiles%\\Reference Assemblies\\Microsoft\\Windows Identity Foundation\\v4.0.

Créer un découpage de sécurité personnalisé préliminaire

Pour créer le fichier de classe pour le découpage de sécurité préalable

  1. Dans le menu PROJET, choisissez Ajouter un nouvel élément.
  2. Sous Éléments Visual c# dans les Modèles installés, sélectionnez le Code, puis classe.
  3. Tapez CustomSecurityPreTrimmer.cs, puis cliquez sur Ajouter.

Écriture du code préliminaire de découpage de sécurité personnalisé

Votre découpage de sécurité personnalisé doit implémenter l'interface ISecurityTrimmerPre. L'exemple de code suivant est une implémentation de base de cette interface.

Pour modifier le code par défaut dans CustomSecurityPreTrimmer

  1. Ajoutez les directives using suivantes au début de la classe :

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Security.Principal;
    using Microsoft.IdentityModel.Claims;
    using Microsoft.Office.Server.Search.Query;
    using Microsoft.Office.Server.Search.Administration;
    
  2. Spécifiez que la classe CustomSecurityPreTrimmer implémente l'interface ISecurityTrimmerPre dans la déclaration de classe, comme indiqué dans le code suivant.

public class CustomSecurityPreTrimmer : ISecurityTrimmerPre

Pour implémenter les méthodes d'interface ISecurityTrimmerPre

  1. Ajoutez le code suivant pour la déclaration de méthode Initialize().

    public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication)
    {
    }
    

    La version de base de cet exemple n'inclut pas de code dans la méthode Initialize.

  2. Ajoutez le code suivant pour la déclaration de méthode AddAccess( ).

    public IEnumerable<Tuple<Claim, bool>> AddAccess(
                    IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity)
    {
      //AddAccess method implementation, see steps 3-5.
    }
    
  3. Pour la première partie de l'implémentation de la méthode AddAccess, nous savoir qui est l'utilisateur en regardant le passedUserIdentity.

    if (passedUserIdentity == null)
    {
       throw new ArgumentException("AddAccess method is called with invalid user identity
       parameter", "passedUserIdentity");
    }
    
       String strUser = null;
       var claimsIdentity = (IClaimsIdentity)passedUserIdentity;
       if (claimsIdentity != null)
       {
          foreach (var claim in claimsIdentity.Claims)
          {
             if (claim == null)
             {
                continue;
             }
    
             // strUser is "domain\\\\user" format when web app is in Claims Windows Mode
             if (SPClaimTypes.Equals(claim.ClaimType, SPClaimTypes.UserLogonName))
             {
                strUser = claim.Value;
                break;
             }
    
             // strUser2 is "S-1-5-21-2127521184-1604012920-1887927527-66602" when web app is
                in Legacy Windows Mode
             // In this case we need to convert it into NT user format.
             if (SPClaimTypes.Equals(claim.ClaimType, ClaimTypes.PrimarySid))
             {
                strUser = claim.Value;
                SecurityIdentifier sid = new SecurityIdentifier(strUser);
                strUser = sid.Translate(typeof(NTAccount)).Value;
                break;
             }
          }
    }
    
  4. Créer une liste, remplir la liste avec les revendications et renvoyer la liste, comme illustré dans le code suivant.

    var claims = new LinkedList<Tuple<Claim, bool>>();
    if (!string.IsNullOrEmpty(strUser))
       {
          var groupMembership = GetMembership(strUser);
          if (!string.IsNullOrEmpty(groupMembership))
          {
             var groups = groupMembership.Split(new[] {';'},
             StringSplitOptions.RemoveEmptyEntries);
             foreach (var group in groups)
             {
                claims.AddLast(new Tuple<Claim, bool>(
                new Claim("http://schemas.happy.bdc.microsoft.com/claims/acl", group), false));
             }
          }
       }
       return claims;
    }
    

    La méthode GetMembership contient la logique personnalisée de votre découpage.

Créer un découpage de sécurité personnalisé après

Pour créer le fichier de classe pour le découpage de sécurité postérieures à

  1. Dans le menu PROJET, choisissez Ajouter un nouvel élément.
  2. Sous Éléments Visual c# dans les Modèles installés, sélectionnez le Code, puis classe...
  3. Tapez CustomSecurityPostTrimmer.cs, puis cliquez sur Ajouter.

Écriture du code après découpage de sécurité personnalisé

Votre découpage de sécurité personnalisé doit implémenter l'interface ISecurityTrimmerPost. L'exemple de code dans cette section est une implémentation de base de cette interface.

Pour modifier le code par défaut dans CustomSecurityPostTrimmer

  1. Ajoutez les directives using suivantes au début de la classe :

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Security.Principal;
    using Microsoft.IdentityModel.Claims;
    using Microsoft.Office.Server.Search.Query;
    using Microsoft.Office.Server.Search.Administration;
    
  2. Spécifiez que la classe CustomSecurityPostTrimmer implémente l'interface ISecurityTrimmerPost dans la déclaration de classe, comme suit :

    public class CustomSecurityPostTrimmer : ISecurityTrimmerPost
    

Pour implémenter les méthodes d'interface ISecurityTrimmerPost

  1. Ajoutez le code suivant pour la déclaration de méthode Initialize().

    public void Initialize(NameValueCollection staticProperties, SearchServiceApplication searchApplication)
    {
    
    }
    

    La version de base de cet exemple n'inclut pas de code dans la méthode Initialize.

  2. Ajoutez le code suivant pour la déclaration de méthode CheckAccess().

    public BitArray CheckAccess(IList<string> documentCrawlUrls, IList<string> documentAcls, IDictionary<string, object> sessionProperties, IIdentity passedUserIdentity)
    {
      //CheckAccess method implementation, see steps 3-5.
    }
    
  3. Pour la première partie de l'implémentation de la méthode CheckAccess, déclarer et initialiser une variable BitArray pour stocker les résultats de la vérification d'accès pour chaque URL de la collection documentCrawlUrls et récupérer l'utilisateur qui a envoyé la requête, comme illustré dans le code suivant.

    if (documentCrawlUrls == null)
    {
       throw new ArgumentException("CheckAccess method is called with invalid URL list",
       "documentCrawlUrls");
    }
    if (documentAcls == null)
    {
       throw new ArgumentException("CheckAccess method is called with invalid documentAcls
       list", "documentAcls");
    }
    if (passedUserIdentity == null)
    {
       throw new ArgumentException("CheckAccess method is called with invalid user identity
       parameter", "passedUserIdentity");
    }
    
  4. Boucle sur chaque URL d'analyse dans la collection et effectuer la vérification d'accès pour déterminer si l'utilisateur qui a envoyé que la requête peut accéder à l'URL analyse à associé à l'élément de contenu, comme illustré dans le code suivant.

    // Initialize the bit array with TRUE value which means all results are visible by default.
    var urlStatusArray = new BitArray(documentCrawlUrls.Count, true);
    var claimsIdentity = (IClaimsIdentity)passedUserIdentity;
    if (claimsIdentity != null)
    {
       var userGroups = GetGroupList(claimsIdentity.Claims);
       var numberDocs = documentCrawlUrls.Count;
       for (var i = 0; i < numberDocs; ++i)
       {
          if (!string.IsNullOrEmpty(documentAcls[i]))
          {
             urlStatusArray[i] = VerifyAccess(documentAcls[i], userGroups);
          }
       }
    }
    

    Si l'utilisateur a accès à l'élément de contenu, définissez la valeur de l'élément BitArray cet index, urlStatusArray[i], à true; Sinon, affectez-lui false.

  5. Définissez la valeur de retour de la méthode CheckAccess à urlStatusArray, comme illustré dans le code suivant.

    return urlStatusArray;
    

Enregistrer le découpage de sécurité personnalisé.

Cette étape décrit comment configurer le découpage de sécurité personnalisé et comprend les tâches suivantes :

  • Inscription du découpage de sécurité personnalisé pour l'application de service de recherche à l'aide des applets de commande Windows PowerShell.
  • Redémarrer le contrôleur d'hôte de recherche SharePoint (SPSearchHostController).

Enregistrer le découpage de sécurité personnalisé.

Vous utilisez SharePoint Management Shell pour inscrire un découpage de sécurité personnalisé avec ClassName. Dans notre cas, ClassName peut être CustomSecurityPreTrimmer ou CustomSecurityPostTrimmer. La procédure suivante montre comment inscrire un découpage de sécurité personnalisé, avec l'ID est défini sur 1 pour l'application de service de recherche.

Pour inscrire le découpage de sécurité personnalisé

  1. Dans Windows Explorer, recherchez CustomSecurityTrimmerSample.dll dans le chemin <Local_Drive> :\WINDOWS\assembly.

  2. Ouvrez le menu contextuel pour le fichier, puis choisissez Propriétés.

  3. Sous l'onglet Général de la boîte de dialogue Propriétés, sélectionnez le jeton et copiez-le.

  4. Ouvrez SharePoint Management Shell. Pour plus d’informations sur l’utilisation de cet outil, voir Administration d’applications de service à l’aide de SharePoint 2010 Management Shell

  5. À l’invite de commandes, tapez la commande suivante :

    New-SPEnterpriseSearchSecurityTrimmer -SearchApplication "Search Service Application"
    -typeName "CustomSecurityTrimmerSample.ClassName, CustomSecurityTrimmerSample,
    Version=1.0.0.0, Culture=neutral, PublicKeyToken=token" -RulePath "xmldoc://*"
    

    Dans la commande , remplacez ClassName par CustomSecurityPreTrimmer ou CustomSecurityPostTrimmer et jeton par le jeton de clé publique pour le fichier CustomSecurityTrimmerSample.dll. Vous devez associer tous les filtrages à une règle d'analyse, "xmldoc://*"; mais cette étape est facultative pour les découpages préliminaire.

    Remarque

    [!REMARQUE] Si vous avez plusieurs serveurs web frontaux, vous devez déployer votre découpage de sécurité dans le global assembly cache sur tous les serveurs web frontaux de la batterie de serveurs.

  6. Vérifiez que votre découpage de sécurité est enregistré avec les applets de commande PowerShell suivante.

    $searchApp = Get-SPEnterpriseSearchServiceApplication
    $searchApp | Get-SPEnterpriseSearchSecurityTrimmer
    

    Votre découpage de sécurité doit être visible dans les résultats.

Pour redémarrer le contrôleur d'hôte de recherche SharePoint

  • Vous pouvez redémarrer le Service de recherche en tapant l'applet de commande PowerShell suivante.

    net restart sphostcontrollerservice
    

Voir aussi