Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Saiba como configurar a segurança no nível do item ao rastrear dados externos com conectores de indexação BCS no SharePoint.
Importante
Os Serviços de Conectividade Empresarial (BCS) e as configurações baseadas em NTLM são suportados principalmente no Servidor do SharePoint. Estas abordagens não são frequentemente utilizadas no SharePoint Online, onde são preferíveis a autenticação moderna e os conectores baseados no Microsoft Graph.
Sistemas externos com autenticação NTLM
Para sistemas externos que oferecem suporte à autenticação NTLM, o descritor de segurança pode ser obtido para cada instância do tipo de conteúdo externo em tempo de rastreamento e armazenado no índice de conteúdo. Durante o tempo de consulta, o descritor de segurança do usuário que está enviando a consulta de pesquisa é comparado com o descritor de segurança armazenado para determinar se o usuário tem acesso ao item. Essa é a maneira mais rápida para executar a filtragem de segurança no conjunto de resultados. O modelo de metadados para o sistema externo deve indicar onde se encontra o descritor de segurança como um campo de tipo de conteúdo externo ou o método.
Campo de tipo de conteúdo externo
O Microsoft SharePoint armazena o descritor de segurança se o campo do tipo de conteúdo externo que contém o descritor estiver marcado com a WindowsSecurityDescriptorField propriedade , conforme mostrado no exemplo seguinte.
<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>
Observação
Os itens estão limitados a um tamanho específico, que as listas de controlo de acesso (ACL) podem facilmente exceder. Portanto, a estrutura do conector Pesquisa ignora solicitações para itens de cache, caso eles contenham um campo de descritor de segurança.
Método de tipo de conteúdo externo
Se tiver um método definido no modelo de metadados que devolve o descritor de segurança de um item com base no respetivo identificador, pode utilizar o estereótipo do BinarySecurityDescriptorAccessor método, conforme mostrado no exemplo seguinte.
<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>
O código a seguir é o método de assinatura para o método especificado no exemplo anterior.
Public static Byte[]GetItemSecurity (string id) { }
Sistemas externos com os esquemas de autenticação que podem ser mapeados para a autenticação NTLM
Se o sistema externo não suporta a autenticação NTLM, mas os usuários do sistema externo podem ser mapeados para usuários do Windows usando uma tabela de mapeamento, você pode usar a abordagem descrita nos exemplos de código de dois anterior para fornecer segurança de nível de item. Para que isso funcione, o serviço da web ou Windows Communication Foundation (WCF) expostos pelo sistema externo deve incluir um método que converte os usuários do sistema externo para usuários do Windows internamente e retorna um descritor de segurança do Windows para cada URL. O exemplo a seguir mostra como você poderia código esse 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;
}