Sicherheit für WCF RIA Services

Dieses Thema enthält Informationen dazu, wie Sie die sichere Verwendung eines Domänendiensts sicherstellen können. Wenn Sie einen Domänendienst verfügbar machen, indem Sie das EnableClientAccessAttribute-Attribut anwenden, ist der Domänendienst für alle Benutzer im jeweiligen Netzwerk verfügbar. Sie können nicht davon ausgehen, dass die Clientanwendung die einzige Anwendung ist, die auf den Domänendienst zugreift. Dieser Aspekt ist bei einem öffentlichen Netzwerk besonders wichtig. Wenn sensible Daten verfügbar gemacht werden, ist er jedoch auch bei einem eingeschränkten Netzwerk wie einem Unternehmensnetzwerk von Bedeutung.

Im Dialogfeld Neue Domänendienstklasse hinzufügen wird Code erzeugt, der Sie bei den ersten Schritten mit einem Domänendienst unterstützt. Der erzeugte Code ist nicht zwangsläufig bereit für die Bereitstellung. Sie müssen den Code überprüfen und entsprechend den Sicherheitsanforderungen Ihrer Anwendung ändern. Besonders zu beachten sind dabei die Vorgänge, die Sie für alle Benutzer im Netzwerk verfügbar machen. Die folgende Prüfliste kann als Ausgangspunkt genutzt werden, um die sichere Verwendung eines Domänendiensts sicherzustellen.

Sicherheitsprüfliste

Beachten Sie die folgenden Hinweise und Empfehlungen, um die sichere Verwendung eines Domänendiensts sicherzustellen.

  1. Minimieren Sie die Daten und Vorgänge, die von einem Domänendienst verfügbar gemacht werden. Dies ist die primäre Schutzmaßnahme gegen die Offenlegung von Informationen und Denial-of-Service-Angriffe.

    1. Machen Sie nur die Entitäten verfügbar, die vom Client benötigt werden. Dieser Ansatz erfordert möglicherweise eine Trennung der Serverlogik und -validierung von der Clientlogik und -validierung, wenn die Anzahl verfügbar gemachter Entitäten dadurch reduziert werden kann. Eine Spesenabrechnungsanwendung, für die die Mitarbeiterentität auf dem Client nicht benötigt wird, sollte diese Entität z. B. nicht über einen Domänendienst verfügbar machen.

    2. Strukturieren Sie Entitäten, um zu vermeiden, dass sensible Daten verfügbar gemacht werden. Sie können die für einen Client verfügbaren Daten mithilfe des ExcludeAttribute-Attributs oder mit Darstellungsmodelle reduzieren. Wenn Geburtsdatum und Sozialversicherungsnummer in einer Anwendung z. B. nicht erforderlich sind, schließen Sie sie von der für den Client sichtbaren Form aus.

    3. Verwenden Sie anstelle von Datenfilterungsfunktionen in LINQ Abfragemethoden, die die Eingabe der in der Anwendung erforderlichen Parameter erfordern. Wenn z. B. Spesenabrechnungen für einen Mitarbeiter angezeigt werden, sollte in der Abfragemethode eine Mitarbeiter-ID als Parameter erforderlich sein, und es sollte keine Methode bereitgestellt werden, die alle Spesenabrechnungen abruft. Dieser Ansatz minimiert die Wahrscheinlichkeit eines Datendiebstahls für alle Mitarbeiter.

    4. Erstellen Sie Abfragemethoden, die nur die für bestimmte Szenarien in der Anwendung benötigten Daten bereitstellen. Sie können mehrere Abfragemethoden bereitstellen, die Teile der Daten zurückgeben, anstelle einer einzelnen Abfragemethode, die alle Daten zurückgibt. Wenn Produkte z. B. nach Kategorie oder Lieferant angezeigt werden, können Sie anstelle einer einzelnen Methode, die alle Produkte zurückgibt, zwei Methoden bereitstellen, die Kategorie- bzw. Lieferanteninformationen akzeptieren.

    5. Filtern Sie Daten, um nur die normalerweise für die Anwendung erforderlichen Daten bereitzustellen. Sie können z. B. eine Abfragemethode erstellen, die nur Aufträge aus dem vergangenen Jahr zurückgibt.

    6. Schränken Sie die Anzahl von Ergebnissen ein, die von einer Abfrage zurückgegeben werden können, um die Möglichkeit einer versehentlichen oder absichtlichen Überladung des Servers zu minimieren. Zum Einschränken der Anzahl von Ergebnissen wird die ResultLimit-Eigenschaft für das QueryAttribute verwendet. Wenn z. B. viele Produkte zurückgegeben werden können, erzwingen Sie auf dem Client das Paging, indem Sie die Ergebnisse auf 20 beschränken. Sie können auch das OutputCacheAttribute-Attribut verwenden, um eine Ausgabezwischenspeicherung zu implementieren und so die Auslastung der mittleren Ebene und der Datenbank zu reduzieren.

    7. Minimieren Sie die Anzahl von Vorgängen, die für jede Entität verfügbar gemacht werden. Wenn in einer Bestellanwendung z. B. nur Aufträge hinzugefügt oder geändert werden müssen, sollten Sie Abfrage-, Einfüge- und Aktualisierungsvorgänge für die Auftragsentität verfügbar machen, aber keine Löschvorgänge. Zudem sollten Sie für die Produktentität nur Abfragevorgänge verfügbar machen und keine Datenänderungsvorgänge.

    8. Verwenden Sie nach Möglichkeit benannte Updatemethoden, die die aktualisierbaren Member einschränken.

  2. Beschränken Sie den Zugriff auf Daten und Vorgänge auf authentifizierte Benutzer und Benutzer in bestimmten Rollen.

    1. Vermeiden Sie nach Möglichkeit anonymen Zugriff, indem Sie das RequiresAuthenticationAttribute-Attribut verwenden. Wenn Sie anonymen Zugriff zulassen müssen, sollten Sie ihn auf den kleinsten Satz von Domänendiensten und die kleinste Teilmenge von Vorgängen innerhalb dieser Domänendienste beschränken.

    2. Fügen Sie nach Möglichkeit das vorgangsspezifische RequiresRoleAttribute-Attribut hinzu. Betrachten Sie jeden Vorgang in einem Domänendienst einzeln. Es ist z. B. möglich, dass die Produktentität von allen Benutzern abgefragt, aber nur von Benutzern in der Administratorrolle aktualisiert werden muss.

    3. Verwenden Sie ggf. die AuthorizationContext-Eigenschaft, um ein benutzerdefiniertes Autorisierungsmodell bereitzustellen.

    4. Behandeln Sie alle von einem Client gesendete Daten als verdächtige Daten. Ein böswilliger Client (sogar ein authentifizierter und autorisierter Client) kann manipulierte Werte für aktuelle und ursprüngliche Werte in einem Changeset senden. Die Anwendungslogik sollte nicht davon ausgehen, dass diese Werte vertrauenswürdig sind. Planen Sie stattdessen potenzielle Bedrohungen durch manipulierte ursprüngliche Werte ein.

  3. Verwenden Sie das https-Protokoll zur Formularauthentifizierung. Das Senden von Klartextkennwörtern stellt ein erhebliches Sicherheitsrisiko dar, das jedoch durch die Verwendung von https gemindert werden kann.

  4. Machen Sie nur die Mindestanzahl von Endpunkten verfügbar. Standardmäßig erstellt RIA Services einen binären Endpunkt für einen Domänendienst. Fügen Sie nur dann zusätzliche Endpunkte hinzu, wenn diese von Clients benötigt werden. Deaktivieren Sie alle nicht verwendeten Endpunkte. 

Siehe auch

Weitere Ressourcen

Silverlight-Sicherheit
ASP.NET-Sicherheit