Поделиться через


Как настроить безопасность на уровне элемента в SharePoint

Узнайте, как настроить безопасность на уровне элементов при обходе внешних данных с использованием соединителей индексации BCS в SharePoint.

Внешние системы с проверкой подлинности NTLM

Для внешних систем, поддерживающих проверку подлинности NTLM, дескриптор безопасности для каждого экземпляра внешнего типа контента можно получить во время обхода контента и сохранить его в индексе контента. Во время выполнения запроса дескриптор безопасности пользователя, отправляющего поисковый запрос, сопоставляется с сохраненным дескриптором безопасности, что позволяет определить наличие у пользователя прав доступа к элементу. Это самый быстрый способ выполнения фильтрации по ролям безопасности для набора результатов. Модель метаданных для внешней системы должна содержать указание на расположение, где дескриптор безопасности размещен как поле или метод внешнего типа контента.

Поле внешнего типа контента

Microsoft SharePoint сохраняет дескриптор безопасности, если поле внешнего типа контента, содержащего дескриптор, помечается с помощью свойства WindowsSecurityDescriptorField , как показано в следующем примере.


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

Примечание.

Ems ограничены определенным размером, который списки управления доступом (ACL) могут легко превысить. Таким образом инфраструктурой соединителя Поиск игнорирует запросы к элементам кэша, если они содержат поля дескриптор безопасности.

Метод внешнего типа контента

При наличии метода, определенного в модели метаданных, возвращающей дескриптор безопасности для элемента в зависимости от его идентификатора, можно использовать стереотип метода BinarySecurityDescriptorAccessor, как показано в следующем примере.


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

Следующий код представляет собой подпись метода для метода, заданного в предыдущем примере.


Public static Byte[]GetItemSecurity (string  id)
{

}

Внешние системы, содержащие схемы проверки подлинности, которые могут сопоставляться с проверкой подлинности NTLM

Если внешние системы не поддерживают проверку подлинности NTLM, но при этом пользователи внешней системы могут быть сопоставлены пользователям Windows посредством таблицы сопоставления, можно использовать подход, описанный в двух предыдущих примерах кода, в целях обеспечения безопасности на уровне элемента. В целях обеспечения работоспособности этой схемы веб-служба или служба Windows Communication Foundation (WCF), представленная внешней системой, должна включать метод, который выполняет внутреннее преобразование пользователей внешней системы в пользователей Windows, после чего возвращает дескриптор безопасности Windows для каждого URL-адреса. В следующем примере рассматривается создание кода такого метода.


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

См. также