2016-07-06 5 views
1

Diese Frage stammt aus dem folgenden Beitrag:Web-Anwendung-Architektur (JavaScript Client-Seite + ASP.NET Server-Seite)

OWIN cookie authentication get roles on client side

ich einen separaten Thread für die Frage erstellt haben, da es ist allgemeiner als eine in der Post oben.

Kurz:

Lassen Sie uns sagen, dass wir eine Web-Anwendung mit Javascript als Client-Seite + ASP.NET Web-api als Server-Seite und auch ein Identitätsserver. Nur authentifizierte Benutzer können auf Web-API-Endpunkte zugreifen, von denen einige nur für bestimmte Benutzerrollen zugänglich sind.

Jetzt sollte die Client-Seite der Anwendung bestimmte Elemente basierend auf der Rolle, in der sich der Benutzer befindet, anzeigen. Beispiel: Benutzer in Administratorrolle kann eine zusätzliche Registerkarte anzeigen: Elemente verwalten. Es gibt zwei Ansätze, dies zu erreichen:

  1. Wenn Client-Anwendung Rendering, könnte man eine endpoind in Web-API-Aufruf, die zurückkommen würde, welche Rollen Benutzer haben. Basierend auf diesem Ergebnis können Sie Elemente in HTML ein- und ausblenden.

  2. Wenn die Anwendung geladen wird, wird ein Endpunkt zurückgegeben, der angibt, wie die Struktur aussehen soll (zum Beispiel: json string), und basierend auf dieser Struktur wird die Clientanwendung gerendert. Kein Anzeigen/Verbergen von HTML auf Client-Seite basierend auf Rollen in einem solchen Fall.

Jetzt 1. Punkt in Bezug auf: einige könnte argumentieren, dass es eine Sicherheitslücke, da böswillige Benutzer html ändern können Elemente zu sehen, dass er nicht sehen soll. Aber in diesem Fall wird er keinen Inhalt aus der Datenbank sehen und kann ihn nicht laden/aktualisieren, da er aufgrund seiner Rolle, die auf der Serverseite überprüft wird, nicht dazu berechtigt ist.

Der zweite Punkt scheint gültiger zu sein, da wir alle identitätsbezogenen Informationslogiken serverseitig beibehalten. Und auch alle unnötigen Inhalte sind nicht in HTML (während im ersten Punkt ist es versteckt) - so dass zu einer besseren Leistung führt? In diesem Fall, wenn zum Beispiel eine Winkelanwendung entwickelt wird, sollte die JSON-Struktur der Anwendung jedoch solche Informationen wie den Namen des Winkelreglers und der Route zum Beispiel enthalten. Wäre das nicht komplex für die Entwicklung der Anwendung?

Angenommen, die Anwendung selbst hat viele Rollen und viele Elemente sollten basierend auf diesen Rollen sichtbar/nicht sichtbar sein.

Vorteile/Nachteile zwischen 1. und 2.? Vielen Dank!

Antwort

1

Ich bleibe immer mit dem ersten vorgeschlagenen Punkt.

Wie Sie erwähnt haben, wird die zweite Wahl mehr Komplexität für die Entwicklung hinzufügen. Für den 1. gibt es kein Sicherheitsleck. Wenn Sie nicht möchten, dass Ihre Benutzer den HTML-Code ändern und auf verbotene Bereiche in Ihrer Anwendung zugreifen, verwenden Sie einfach ng-if anstelle von ng-show. Wenn Sie nicht vertraut sind - ng-if wird nicht nur den Inhalt mit display: none; verstecken. Es wird es vollständig aus dem DOM entfernen und dies führt dazu, dass der Benutzer diesen Inhalt nicht anzeigen kann, da er nicht im DOM ist.

dies für ng-if für ausführlichere Erklärung lesen und ng-show: what is the difference between ng-if and ng-show/ng-hide

Ich habe in der Regel einen Endpunkt Informationen über den Benutzer immer - auch sie Rolle ist und dass die Benutzer in eine Service (Fabrik) speichern. Dies gibt mir die Flexibilität, es überall in der Anwendung zu verwenden und zu überprüfen, ob der Benutzer auf bestimmte Teile davon zugreifen kann oder nicht.

+0

mit ng-wenn der Inhalt aus DOM entfernt wird, gibt es einige Code in angular.js, die die Entfernung macht, so dass ich nur diesen Code kommentieren und den Inhalt sehen konnte :) Die Frage ist dann, ob der Entfernungsprozess von Diese dom-Elemente können die Leistung reduzieren –

+1

Ich bekomme Ihre Argumentation über die Kommentare nicht. Wie auch immer .. 'ng-if' ist langsamer als' ng-show', das ist sicher. Controller und Direktiven müssen erneut ausgeführt werden und so weiter. Aber wenn Sie sie intelligent einsetzen und wissen, wann Sie 'ng-show' und' ng-if' verwenden sollen, werden Sie keine Probleme mit der Leistung haben, um einige Elemente von Benutzern zu verstecken, die keine Einschränkungen haben. Normalerweise sind Sachen, die Sie in diesem Fall verstecken, Links und Buttons und sollten keinen Schaden anrichten, selbst wenn Sie sie mit 'ng-show' verstecken, wenn Sie eine starke Backend-Logik haben. –

+0

Was ich mit Kommentaren meinte, ist, dass ein böswilliger Benutzer den Inhalt der Seite, die aus dom entfernt wurde, immer noch mit ng-if sehen kann. Aber das ist kein großer Schaden, da die Backend-API immer noch geschützt ist –

Verwandte Themen