Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Architektur mit Hirarchie und Berechtigung
kleinrechner
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

Architektur mit Hirarchie und Berechtigung

beantworten | zitieren | melden

Hallo,
habe versucht die aktuelle Struktur graphisch darzustellen. Sieht auf den ersten Blick nach einer ganz normalen Standard-Struktur aus. Die Elemente sind jeweis mit einer 1:n-Verbindung verknüpft.

- .net Framework 4.8
- EntityFramework 6.1

Der angemeldete Benutzer ist auf 0-n Kostenstellen berechtigt, die Checklisten sind mit der Kostenstelle verknüpft. Wenn in ICategory GetAll aufgerufen wird, sollen natürlich nur die Kategorien zurückgegeben werden, auf die der Benutzer berechtigt ist. Ich habe das aktuell so gelöst, dass der "Parent"-Service eine Liste aller Ids, auf die der Benutzer berechtigt ist, zurückgibt und in GetAll() die verwendet werden.


            var availableIds = _checklistService.GetAllIds();
            return _repository.GetAll().Where(x => availableIds.Contains(x.ChecklistId));

Das funktioniert zwar soweit, ich bin mir allerdings nicht sicher, ob das so elegant ist bzw von der performance her Probleme geben könnte. Gibt es hier ein BestPractice?

In diesem Fall muss ich in der Klasse der CategoryService-Klasse das IChecklistService injecten, allerdings möchte ich auch in der ChecklistService-Klasse die ICategoryService injecten, um z.B. alle Kategorien zu löschen, wenn die Checkliste gelöscht wird. Das geht natürlich nicht, weil hier eine Kreisabhängigkeit besteht. Wie würde man das am besten auflösen?

Vielen Dank
Chris
Attachments
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15967

beantworten | zitieren | melden

Zitat
Das funktioniert zwar soweit, ich bin mir allerdings nicht sicher, ob das so elegant ist bzw von der performance her Probleme geben könnte.

Weil Du auch im anderen Thema von Performance sprichst: Dich kostet es vermutlich viel mehr Performance, dass Du noch EF 6.1 verwendest und nicht EF Core.
Die Performance-Faktoren für viele Dinge sind oft im dreistelligen Bereich.

Daher ja gut, dass Du Dir um Performance Gedanken machst: gewichte es aber richtig.
Zitat
Gibt es hier ein BestPractice?


Sind Berechtigungen Teil der Relationen, dann musst Du das in dieser Form eigentlich auch in der Datenbankstruktur darstellen; ansonsten kannst Du das nicht in einem Query darstellen und musst immer von Außen prüfen.

Von Außen prüfen macht man aber anders; die Art und Weise nennt sich Resource-based Authorization; also Authorisierung auf Resourcen-Ebene.
Dazu gibts tausende von Implemementierungsmöglichkeiten, egal ob in Sprachebene (Java, JavaScript, .NET) oder auf Infrastruktur-Ebene (API Management, Kubernetes, OPA).

In .NET gibts dazu ebenfalls eine Implementierung, die zusammen mit ASP.NET Core entstanden ist - aber in jeder anderen App-Art in .NET angewandt werden kann.
Die Authorisierung ist hierbei aber eine eigene Logik-Implementierung, auf die andere Service zugreifen dürfen - aber nicht Repositories (weil sonst Schichtverletzung)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
kleinrechner
myCSharp.de - Member



Dabei seit:
Beiträge: 16

Themenstarter:

beantworten | zitieren | melden

Hallo,
die Berechtigung sollte über die Datenstruktur möglich sein, ich werde mir aber Resource-based Authorization nochmal genauer anschauen, danke für den Hinweis.

Leider ist es mir aktuell nicht möglich auf .net Core/EF Core umzusteigen, auch wenn ich das sehr gerne tun würde.

cu
Chris
private Nachricht | Beiträge des Benutzers