Konfigurieren der Sicherheit auf Elementebene in SharePoint

In diesem Artikel erfahren Sie, wie Sie die Sicherheit auf Elementebene konfigurieren, wenn externe Daten mit BCS-Indizierungsconnectors in SharePoint durchforstet werden.

Wichtig

Business Connectivity Services (BCS) und NTLM-basierte Konfigurationen werden hauptsächlich in SharePoint Server unterstützt. Diese Ansätze werden in SharePoint Online nicht häufig verwendet, wo moderne Authentifizierung und Microsoft Graph-basierte Connectors bevorzugt werden.

Externe Systeme mit NTLM-Authentifizierung

Bei externen Systemen, die die NTLM-Authentifizierung unterstützen, kann der Sicherheitsdeskriptor für jeden instance des externen Inhaltstyps zur Durchforstungszeit abgerufen und im Inhaltsindex gespeichert werden. Während der Abfragezeit wird der Sicherheitsdeskriptor des Benutzers, der die Suchabfrage übermittelt, mit dem gespeicherten Sicherheitsdeskriptor verglichen, um zu bestimmen, ob der Benutzer Zugriff auf das Element hat. Dies ist die schnellste Möglichkeit, sicherheitsrelevante Kürzungen für das Resultset durchzuführen. Das Metadatenmodell für das externe System muss angeben, wo der Sicherheitsdeskriptor als externes Inhaltstypfeld oder -methode gefunden werden kann.

Externes Inhaltstypfeld

Microsoft SharePoint speichert den Sicherheitsdeskriptor, wenn das Feld des externen Inhaltstyps, der den Deskriptor enthält, mithilfe der WindowsSecurityDescriptorField -Eigenschaft markiert wird, wie im folgenden Beispiel gezeigt.

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

Hinweis

Elemente sind auf eine bestimmte Größe beschränkt, die Zugriffssteuerungslisten (Access Control Lists, ACL) leicht überschreiten können. Daher ignoriert das Suchconnectorframework Anforderungen zum Zwischenspeichern von Elementen, wenn diese ein Feld mit der Sicherheitsbeschreibung enthalten.

Methode für externen Inhaltstyp

Wenn Sie eine Methode im Metadatenmodell definiert haben, die den Sicherheitsdeskriptor für ein Element basierend auf seinem Bezeichner zurückgibt, können Sie das BinarySecurityDescriptorAccessor Methodenstereotyp verwenden, wie im folgenden Beispiel gezeigt.

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

Der folgende Code ist die Methodensignatur der im vorherigen Beispiel angegebenen Methode.

Public static Byte[]GetItemSecurity (string  id) { }

Externe Systeme mit Authentifizierungsschemas, die der NTLM-Authentifizierung zugeordnet werden können

Wenn das externe System nicht die NTLM-Authentifizierung unterstützt, die Benutzer des externen Systems aber über eine Zuordnungstabelle Windows-Benutzern zugeordnet werden können, kann zum Bereitstellen von Sicherheit auf Elementebene der in den beiden vorherigen Codebeispielen beschriebene Ansatz befolgt werden. Damit dies funktioniert, muss der Web- oder Windows Communication Foundation (WCF)-Dienst, der vom externen System verfügbar gemacht wird, eine Methode enthalten, die die Benutzer des externen Systems intern in Windows-Benutzer umwandelt und anschließend für jede URL einen Windows-Sicherheitsdeskriptor zurückgibt. Das folgende Beispiel veranschaulicht, wie Sie diese Methode codieren können.

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

Siehe auch