Berechtigungen / rechtes Modell / Muster für .NET-Anwendungen

9

Ich muss flexibel UND einfach implementieren (falls es so etwas gibt) und gleichzeitig, wenn möglich, eingebaute Mittel einsetzen

Bisher habe ich MembershipProvider und RoleProviders implementiert. Das ist cool, aber wohin gehe ich als nächstes?

Ich habe das Gefühl, ich muss den Begriff "Priviledge" hinzufügen und diese dann in der Anwendung fest codieren. Benutzer konfigurieren Rollen, um Rollen Berechtigungen hinzuzufügen und Benutzern Rollen zuzuweisen.

Klingt das nach einem guten Modell? Sollte ich darüber nachdenken, Berechtigungen auf Benutzerebene zusätzlich zu den Rollen hinzuzufügen? Ich könnte, aber ich stelle mir Probleme mit der Einrichtung (verwirrend) und der folgenden Unterstützung vor.

Wenn ich das nicht tue und einige bestimmte Benutzer weniger Berechtigungen benötigen, muss der Administrator eine andere Rolle erstellen, usw.

Irgendeine Silberkugel für ein solches System? Und warum ging Microsoft nicht weiter als nur Mitglieder- und Rollenanbieter?

Eine andere Idee: Lassen Sie die Rollen als "Privilegierten" und sichern Sie sie fest. Dann kann ich diese Rollen in der App mit allen verfügbaren Markups / Attributen usw. codieren - alles Microsoft.

Fügen Sie eine neue Entität "Gruppe" hinzu und erstellen Sie eine solche Beziehung

  • Benutzer
  • Benutzergruppen
  • Gruppen
  • RoleGroups
  • Rollen

Auf diese Weise kann ich Rollen in Gruppen sammeln und diese Gruppen Benutzern zuweisen. Klingt gut und passt zu anderen Softwaremustern. Aber dann kann ich Dinge in RoleProvider nicht wirklich implementieren wie:

  • AddUsersToRoles
  • RemoveUsersFromRoles

Und manche Dinge machen keinen Sinn mehr, weil sie fest codiert sind

  • DeleteRole
  • CreateRole
katit
quelle

Antworten:

5

Wenn die rollenbasierte Autorisierung für Sie nicht detailliert genug ist, sollten Sie die anspruchsbasierte Autorisierung verwenden .

Ein Anspruch beschreibt eine Ressource und Aktivität - ähnlich wie ein Eintrag in einer ACL, jedoch flexibler, da die "Ressource" kein physisches Objekt sein muss, sondern alles sein kann, was Sie möchten, und Informationen enthalten kann Sie wollen.

In diesem Modell entspricht ein Anspruch dem, was Sie als "Privileg" bezeichnen, und Sie gruppieren Ansprüche in Anspruchssätzen, was in etwa dem entspricht, was Sie als "Rolle" bezeichnen. Alle diese APIs und mehr befinden sich bereits im System.IdentityModelNamespace.

Natürlich erwähnen Sie MembershipProviderund RoleProviderund wenn Sie versuchen, dies alles in das ASP.NET-Mitgliedschaftsmodell zu packen (wie diese Namen implizieren), dann vergessen Sie es einfach. Wenn Sie diese Anbieter-APIs verwenden möchten, müssen Sie dies auf ihre Weise tun, und ihre Art wird nicht detaillierter als das Konzept einer Rolle.

Stattdessen wird in ASP.NET das Konzept eines "Privilegs" tatsächlich auf Aktions- oder Operationsebene codiert , wobei Sie angeben, welche Rollen diese Aktion ausführen dürfen. Dies ist in ASP.NET MVC, wo Sie einfach [AuthorizeAttribute]auf Controller oder Controller-Aktionen klopfen, viel einfacher zu handhaben . In ASP.NET der "alten Schule" verarbeiten Sie Ereignisse, sodass die Autorisierung entweder ad-hoc oder auf Seitenebene (oder in beiden Fällen) erfolgt.

Aaronaught
quelle
Viele tolle Informationen, danke! Die App ist eigentlich eine Silverlight-App, bei der ein Teil des Servers als WCF-RESTful-Dienst verfügbar gemacht wird. Claims-Based sieht interessant aus, aber ich habe das Konzept des Benutzers und der Autorisierung darin nicht bemerkt. Interessanter Artikel, den ich gerade gefunden habe: geekswithblogs.net/shahed/archive/2010/02/05/137795.aspx
katit
@katit: Praktisch die gesamte Authentifizierung / Autorisierung in .NET basiert auf der IPrincipal-Schnittstelle . Wenn Sie tun forderungsbasierte Autorisierung dann verwenden Sie eine IClaimsPrincipal für das, und warf das IPrincipalzu , IClaimsPrincipalwenn Sie Anspruch Kontrollen tun möchten. Sie werden viel von Ihrem eigenen Code schreiben, wenn Sie ihn (zum Beispiel) in die Formularauthentifizierung einfügen möchten, aber dies ist natürlich möglich (gemäß dem Link).
Aaronaught
Die Frage ist ... Vielleicht ist es einfacher, Mitgliedschafts- / Rollenanbietern einfach eine weitere "Gruppen" -Ebene hinzuzufügen oder einen eigenen Anbieter zu schreiben? Ziemlich genau so viel Arbeit wie bei der Implementierung von Microsoft
Katit
3
@katit: Berühmte letzte Worte. Erfinde deine eigenen nicht, es sei denn, du hast einen sehr guten Grund, deine eigenen zu erfinden ("es scheint einfacher" ist kein guter Grund; es scheint nur einfacher zu sein, wenn du keine direkte Erfahrung hast und daher nicht in der Lage bist, die zu beurteilen Arbeitsaufwand erforderlich).
Aaronaught