Compartir a través de


Configurar la seguridad a nivel de artículo en SharePoint

Aprenda a configurar la seguridad a nivel de artículo cuando se rastrean datos externos con conectores de indexación BCS en SharePoint.

Sistemas externos con autenticación NTLM

En los sistemas externos que admiten la autenticación NTLM, el descriptor de seguridad para cada instancia del tipo de contenido externo se puede obtener en tiempo de rastreo y almacenar en el índice de contenido. Durante el tiempo de consulta, el descriptor de seguridad del usuario que envía la consulta de búsqueda se compara con el descriptor de seguridad almacenado para determinar si el usuario tiene acceso al elemento. Esta es la forma más rápida de realizar el recorte de seguridad en el conjunto de resultados. El modelo de metadatos del sistema externo debe indicar si se puede encontrar el descriptor de seguridad como un campo o método del tipo de contenido externo.

Campo de tipo de contenido externo

Microsoft SharePoint almacena el descriptor de seguridad si el campo del tipo de contenido externo que contiene el descriptor está marcado mediante la propiedad WindowsSecurityDescriptorField , como se muestra en el ejemplo siguiente.


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

Nota:

Los ems están limitados a un tamaño específico, que las listas de control de acceso (ACL) pueden superar fácilmente. Por lo tanto, el marco del conector de Buscar pasa por alto las solicitudes en los elementos de la memoria caché si contienen un campo del descriptor de seguridad.

Método de tipo de contenido externo

Si tiene un método definido en el modelo de metadatos que devuelve el descriptor de seguridad de un elemento según su identificador, puede usar el estereotipo del método BinarySecurityDescriptorAccessor, como se muestra en el ejemplo siguiente.


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

El código siguiente es la firma del método especificado en el ejemplo anterior.


Public static Byte[]GetItemSecurity (string  id)
{

}

Sistemas externos con esquemas de autenticación que pueden asignarse a la autenticación NTLM

Si el sistema externo no admite la autenticación NTLM, pero los usuarios de sistemas externos se pueden asignar a usuarios de Windows mediante el uso de una tabla de asignación, puede usar el método descrito en los dos ejemplos de código anteriores para proporcionar seguridad de nivel de elemento. Para que esto funcione, el servicio web o el servicio de Windows Communication Foundation (WCF) expuesto por el sistema externo debe incluir un método que convierta los usuarios del sistema externo a usuarios de Windows de forma interna y, a continuación, devuelva un descriptor de seguridad de Windows para cada dirección URL. En el ejemplo siguiente se muestra cómo codificar este método.


/// 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;
}

Vea también