Sécurité au niveau de l’élément
Microsoft SharePoint Server 2010 offre de nouvelles fonctionnalités qui permettent de bénéficier d’une sécurité au niveau de l’élément pour les données provenant de systèmes externes.
Dernière modification : vendredi 8 octobre 2010
S’applique à : SharePoint Server 2010
Vous pouvez configurer la sécurité au niveau de l’élément de différentes manières, selon le mode d’authentification pris en charge par le système externe.
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
Recherche Microsoft SharePoint Server 2010 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 indiqué 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>
Notes
Si vous renvoyez le descripteur de sécurité comme champ du type de contenu externe, vous ne pouvez pas utiliser la mise en cache cliente car les éléments mis en cache sont limités à une taille spécifique que les listes de contrôle d’accès peuvent facilement dépasser. Par conséquent, l’infrastructure du connecteur Recherche SharePoint Server ignore les demandes de mise en cache d’éléments s’ils 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 WCF (Windows Communication Foundation) 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;
}