Partager via


Configurer la sécurité de niveau élément dans SharePoint

Découvrez comment configurer la sécurité au niveau de l’élément lors de l’analyse de données externes avec les connecteurs d’indexation BCS dans SharePoint.

Systèmes externes avec authentification NTLM

Pour les systèmes externes qui prennent en charge l'authentification NTLM, le descripteur de sécurité peut être obtenu pour chaque instance du type de contenu externe au moment de l'analyse et stocké dans l'index de contenu. Au moment de la requête, le descripteur de sécurité de l'utilisateur qui soumet la requête de recherche est comparé au descripteur de sécurité stocké afin de déterminer si l'utilisateur a accès à l'élément. Il s'agit du moyen le plus rapide d'effectuer un découpage de sécurité sur le jeu de résultats. Le modèle de métadonnées pour le système externe doit indiquer si le descripteur de sécurité peut être trouvé comme méthode ou champ de type de contenu externe.

Champ de type de contenu externe

Microsoft SharePoint stocke le descripteur de sécurité si le champ du type de contenu externe qui contient le descripteur est marqué à l’aide de la propriété WindowsSecurityDescriptorField , comme illustré dans l’exemple suivant.


<Method Name="Item SpecificFinder ">
  <Properties>
    <Property Name="RdbCommandType" Type="System.Data.CommandType, System.Data, 
 Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">Text</Property>
    <Property Name="RdbCommandText" Type="System.String">SELECT [Identifier] , 
 [SecurityDescriptor] FROM [Test].[dbo].[Items] WHERE [Identifier] = @Identifier</Property>
    <Property Name="BackEndObjectType" Type="System.String">SqlServerTable</Property>
    <Property Name="BackEndObject" Type="System.String">Items</Property>
    <Property Name="Schema" Type="System.String">dbo</Property>
  </Properties>
  <Parameters>
    <Parameter Direction="In" Name="@Identifier">
      <TypeDescriptor TypeName="System.Int32" IdentifierName="Identifier" Name="Identifier" />
    </Parameter>
    <Parameter Direction="Return" Name="BaseItemsRead Item">
      <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="BaseItemsRead Item">
        <TypeDescriptors>
          <TypeDescriptor TypeName="System.Data.IDataRecord, System.Data, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" Name="BaseItemsRead ItemElement">
          <TypeDescriptors>
            <TypeDescriptor TypeName="System.Int32" IdentifierName="Identifier" Name="Identifier"/>
            <TypeDescriptor TypeName="System.Byte[], mscorlib, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" IsCollection="true" Name="SecurityDescriptor">
              <TypeDescriptors>
                <TypeDescriptor TypeName="System.Byte" Name="SecurityDescriptorElement" />
              </TypeDescriptors>
            </TypeDescriptor>
            </TypeDescriptors>
          </TypeDescriptor>
          </TypeDescriptors>
        </TypeDescriptor>
      </Parameter>
    </Parameters>
    <MethodInstances>
      <MethodInstance Type="SpecificFinder" ReturnParameterName="BaseItemsRead Item"
 ReturnTypeDescriptorName="BaseItemsRead ItemElement" Name="BaseItemsRead Item"
DefaultDisplayName="ReadSecurity">
        <Properties>
          <Property Name="WindowsSecurityDescriptorField" Type="System.String">
                SecurityDescriptor
          </Property>
        </Properties>
      </MethodInstance>
    </MethodInstances>
</Method>

Remarque

Les ems sont limités à une taille spécifique, que les listes de contrôle d’accès (ACL) peuvent facilement dépasser. Par conséquent, l'infrastructure du connecteur Search ignore les demandes pour les éléments du cache si elles contiennent un champ de descripteur de sécurité.

Méthode de type de contenu externe

Si vous avez une méthode définie dans le modèle de métadonnées qui renvoie le descripteur de sécurité pour un élément en fonction de son identificateur, vous pouvez utiliser le stéréotype de méthode BinarySecurityDescriptorAccessor, comme indiqué dans l'exemple suivant.


<Method Name="GetItemSecurity" LobName="GetItemSecurity">
  <Parameters>
    <Parameter Name="itemId" Direction="In">
      <TypeDescriptor Name="itemId" TypeName="System.Int32, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
IdentifierEntityNamespace="MS.Internal.Test.Automation.Search.Scater" 
IdentifierEntityName="Item" IdentifierName="ItemId" /> 
    </Parameter>
    <Parameter Name="Return" Direction="Return">
      <TypeDescriptor Name="SecurityDescriptor" TypeName="System.Byte[],
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
IsCollection="true">
        <TypeDescriptors>
          <TypeDescriptor Name="Item" TypeName="System.Byte, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </TypeDescriptors>
      </TypeDescriptor>
    </Parameter>
  </Parameters>
  <MethodInstances>
    <MethodInstance Name="GetItemSecurity_Instance" Type="BinarySecurityDescriptorAccessor"
 ReturnParameterName="Return" ReturnTypeDescriptorName="SecurityDescriptor" 
ReturnTypeDescriptorLevel="0">
      <Properties>
        <Property Name="WindowsSecurityDescriptorField" Type="System.String">
            SecurityDescriptor
        </Property>
      </Properties>
      <AccessControlList>
        <AccessControlEntry Principal="NT AUTHORITY\\Authenticated Users">
          <Right BdcRight="Execute" />
        </AccessControlEntry>
      </AccessControlList>
    </MethodInstance>
  </MethodInstances>
</Method>

Le code suivant est la signature de la méthode spécifiée dans l'exemple précédent.


Public static Byte[]GetItemSecurity (string  id)
{

}

Systèmes externes avec des modèles d'authentification qui peuvent être mappés à l'authentification NTLM

Si le système externe ne prend pas en charge l'authentification NTLM, mais que les utilisateurs du système externe peuvent être mappés à des utilisateurs Windows à l'aide d'une table de mappage, vous pouvez utiliser l'approche décrite dans les deux exemples de code précédents afin de bénéficier d'une sécurité au niveau de l'élément. Pour que cela fonctionne, le service Web ou service Windows Communication Foundation (WCF) exposé par le système externe doit comprendre une méthode qui convertit les utilisateurs du système externe à des utilisateurs Windows en interne et qui renvoie ensuite un descripteur de sécurité Windows pour chaque URL. L'exemple suivant montre comment coder cette méthode.


/// Returns the security descriptor for a user.
/// </summary>
/// <param name="domain"></param>
/// <param name="username"></param>
/// <returns></returns>

private Byte[] GetSecurityDescriptor(string domain, string username)
{
   NTAccount acc = new NTAccount(domain, username);
   SecurityIdentifier sid = (SecurityIdentifier)acc.Translate(typeof(SecurityIdentifier));
   CommonSecurityDescriptor sd = new CommonSecurityDescriptor(false, false, ControlFlags.None,
sid, null, null, null);
   sd.SetDiscretionaryAclProtection(true, false);

//Deny access to all users.
   SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
   sd.DiscretionaryAcl.RemoveAccess(AccessControlType.Allow, everyone, 
unchecked((int)0xffffffffL), InheritanceFlags.None, PropagationFlags.None);

//Grant full access to a specified user.
   sd.DiscretionaryAcl.AddAccess(AccessControlType.Allow, sid, 
unchecked((int)0xffffffffL), InheritanceFlags.None, PropagationFlags.None);
 
   byte[] secDes = new Byte[sd.BinaryLength];
   sd.GetBinaryForm(secDes, 0);

   return secDes;
}

Voir aussi