Rollenbasierte Zugriffssteuerung (RBAC) vs. anspruchsbasierte Zugriffssteuerung (CBAC) in ASP.NET MVC


147

Was sind die Hauptvorteile der Verwendung von CBAC gegenüber RBAC ? Wann ist es besser, CBAC zu verwenden, und wann ist es besser, RBAC zu verwenden?

Ich versuche, die allgemeinen Konzepte des CBAC-Modells zu verstehen, aber die allgemeine Idee ist mir immer noch nicht klar.


1
Diese Konzepte sind für mich auch noch sehr vage. Sie scheinen dasselbe zu tun. Die eine ist nur eine Rolle mit einem Wert?
Zapnologica

Antworten:


262

Ich werde versuchen zu zeigen, wie Sie von der anspruchsbasierten Zugriffssteuerung in einem ASP.NET MVC-Kontext profitieren können.

Wenn Sie die rollenbasierte Authentifizierung verwenden und eine Aktion zum Erstellen eines Kunden haben und möchten, dass die Personen in der Rolle "Verkauf" dazu in der Lage sind, schreiben Sie Code wie folgt:

[Authorize(Roles="Sale")]
public ActionResult CreateCustomer()
{
    return View();
}

Später wurde Ihnen klar, dass Personen aus der Rolle "Marketing" manchmal in der Lage sein sollten, Kunden zu erstellen. Dann aktualisieren Sie Ihre Aktionsmethode so

[Authorize(Roles = "Sale", "Marketing")]
public ActionResult CreateCustomer()
{
    return View();
}

Jetzt haben Sie festgestellt, dass einige der Marketingmitarbeiter möglicherweise nicht in der Lage sind, Kunden zu erstellen, aber es ist nicht möglich, den Marketingmitarbeitern eine andere Rolle zuzuweisen. Sie müssen also allen Marketingmitarbeitern erlauben, Kunden zu erstellen.

Sie haben ein weiteres Problem festgestellt. Jedes Mal, wenn Sie entscheiden, dass Marketingmitarbeiter Kunden erstellen dürfen, müssen Sie alle MVC-Aktionsmethoden aktualisieren. Attribut "Autorisieren", Ihre Anwendung kompilieren, testen und bereitstellen. Einige Tage später haben Sie entschieden, dass kein Marketing, sondern eine andere Rolle die Aufgabe ausführen soll. Sie suchen also in Ihrer Codebasis und löschen alle "Marketing" aus dem Attribut "Autorisieren" und fügen Ihren neuen Rollennamen im Attribut "Autorisieren" hinzu ... Nicht a gesunde Lösung. Zu diesem Zeitpunkt würden Sie einen Bedarf an berechtigungsbasierter Zugriffskontrolle erkennen.

Die berechtigungsbasierte Zugriffssteuerung ist eine Möglichkeit, verschiedenen Benutzern verschiedene Berechtigungen zuzuweisen und zu überprüfen, ob ein Benutzer die Berechtigung hat, zur Laufzeit eine Aktion aus dem Code auszuführen. Nachdem Sie verschiedenen Benutzern verschiedene Berechtigungen zugewiesen haben, stellen Sie fest, dass Sie einigen Benutzern erlauben müssen, Code auszuführen, wenn der Benutzer über Eigenschaften wie "Facebook-Benutzer", "Langzeitbenutzer" usw. verfügt. Lassen Sie mich ein Beispiel geben. Angenommen, Sie möchten den Zugriff auf eine bestimmte Seite zulassen, wenn der Benutzer über Facebook angemeldet ist. Würden Sie jetzt eine Berechtigung "Facebook" für diesen Benutzer erstellen? Nein, 'Facebook' klingt nicht nach einer Erlaubnis. Macht es ? Es klingt eher nach einer Behauptung. Gleichzeitig können Berechtigungen auch wie Claim klingen !! Es ist daher besser, nach Ansprüchen zu suchen und den Zugriff zuzulassen.

Kehren wir nun zum konkreten Beispiel der anspruchsbasierten Zugriffskontrolle zurück.

Sie können eine Reihe von Ansprüchen wie folgt definieren:

"CanCreateCustomer", "CanDeleteCustomer", "CanEditCustomer" .. etc ..

Jetzt können Sie Ihre Aktionsmethode folgendermaßen dekorieren:

        [ClaimAuthorize(Permission="CanCreateCustomer")]
        public ActionResult CreateCustomer()
        {
            return View();
        }

(Bitte beachten Sie, dass [ClaimAuthorize (Permission = "CanCreateCustomer")] möglicherweise nicht in die MVC-Klassenbibliothek integriert ist. Ich zeige nur als Beispiel, dass Sie eine Klassenbibliothek mit einer solchen Attributklassendefinition verwenden können.)

Jetzt können Sie sehen, dass die CreateCustomer-Aktionsmethode immer die Berechtigung 'CanCreateCustomer' benötigt und sich nie oder kaum ändert. Daher erstellen Sie in Ihrer Datenbank eine Tabelle mit Berechtigungen (Ansprüchen) und einer Benutzerberechtigungsbeziehung. In Ihrem Admin-Bereich können Sie Berechtigungen (Ansprüche) für jeden Benutzer festlegen, der was tun kann. Sie können jedem Benutzer, den Sie möchten, die Berechtigung "CanCreateCustomer" (Anspruch) zuweisen, und nur der zulässige Benutzer kann einen Kunden erstellen, und der zulässige Benutzer kann nur den Kunden und nichts anderes erstellen (es sei denn, Sie weisen demselben Benutzer andere Berechtigungen zu).

Dieses Sicherheitsmodell bietet Ihnen eine saubere Code-Praxis. Darüber hinaus müssen Sie beim Schreiben Ihrer Aktionsmethode nicht darüber nachdenken, wer diese Methode verwenden kann, sondern Sie können immer sicher sein, dass jeder, der diese Methode verwendet, über die vom Administrator erteilte Berechtigung (Anspruch) verfügt. Dann kann der Administrator entscheiden, wer was tun kann. Nicht du als Entwickler. So wird Ihre Geschäftslogik von der Sicherheitslogik getrennt.

Wenn sich jemand anmeldet, überprüft Ihre Anwendung, welche Berechtigungen für diesen Benutzer verfügbar sind, und dieser Berechtigungssatz (Anspruchssatz) ist als zusätzliche Eigenschaften des aktuell angemeldeten Benutzers verfügbar (normalerweise wird der Anspruchssatz als Cookie für den angemeldeten Benutzer gespeichert). Sie müssen also nicht ständig den Berechtigungssatz aus der Datenbank überprüfen. Unter dem Strich erhalten Sie mehr Kontrolle über Ihre Sicherheitslogik in Ihrer Anwendung, wenn Sie einen anspruchsbasierten Zugriff anstelle eines rollenbasierten Zugriffs anwenden. Tatsächlich kann eine Rolle auch als Anspruch betrachtet werden.

Wenn es sich bei Ihrer Anwendung um eine sehr kleine Anwendung handelt, bei der es nur zwei Rollen gibt: Kunde und Administrator, und es keine Chance gibt, dass der Kunde etwas anderes als das tun kann, was er in Ihrer Anwendung tun soll, dann möglicherweise rollenbasiert Die Zugriffskontrolle wird den Zweck erfüllen, aber wenn Ihre Anwendung wächst, werden Sie irgendwann das Bedürfnis nach einer anspruchsbasierten Zugriffskontrolle verspüren.


10
Was mich verwirrt, ist, wie Rollen in Ansprüche einfließen - sind Rollen in anspruchsbasierten Systemen nicht im Grunde eine Gruppierung von Ansprüchen, damit Sie Dinge massenweise zuweisen können? Zum Beispiel kann man sagen, dass Bob in der Rolle Marketing ist und jeder im Marketing Ansprüche hatCanCreateCustomer, CanViewAdCampaigns
George Mauer

9
Wow, ich habe versucht herauszufinden, wie diese ganze Behauptung funktioniert, aber ich habe NIE alle vagen abstrakten Erklärungen und Beispiele verstanden. Ihr Beitrag war der erste, der mir den Kopf geöffnet und die Botschaft vermittelt hat. Vielen Dank, dass Sie es so kurz erklärt haben.
Leon Cullens

3
Dies ist eine sehr nachdenkliche Erklärung, aber ich denke, Sie haben erkannt, dass sie mit Ihrem Kommentar "Der Unterschied liegt eher im Konzept als in der Technologie" unvollständig ist. Es gibt tatsächlich einen Unterschied in der Technologie, den diese Antwort nicht anspricht. Kurz gesagt, ich bin nicht der Meinung, dass es davon abhängt, wie Sie die Rolle definieren, da die beiden Technologien sehr unterschiedliche Anforderungen erfüllen. Ich zögere, Korrekturen anzubieten, da die Antwort selbst sehr hilfreich ist, um Fallen aufzuzeigen, die mit der Anwendung von zu weit gefassten Berechtigungsrollen (oder Ansprüchen) verbunden sind. Leider war das nicht die gestellte Frage.
Hanf

6
Angenommen, ich möchte es so: 1) Eine "Erlaubnis" ist ein Recht, eine einfache Aktion auszuführen, wie "Kunden erstellen". Der Name der Berechtigung beginnt mit "can" - CanCreateCustomer. Die Namen der Berechtigungen sind im Quellcode der App fest codiert. 2) Einem Benutzer können eine Reihe von Berechtigungen zugewiesen werden - jedoch nicht direkt. Der Benutzer erhält Berechtigungen nur über die Rollen. 3) Eine Rolle ist eine Reihe von Berechtigungen, nichts weiter. Einige Endbenutzer (Administratoren) können dynamisch neue benutzerdefinierte Rollen mit willkürlich festgelegten Berechtigungen erstellen (ausgewählt aus einer festen Liste). Die Frage ist: Kann ich das mit dem Claims-basierten Modell so machen?
Dmitry Arestov

7
In der Microsoft-Dokumentation heißt es: Ein Anspruch ist ein Name-Wert-Paar, das darstellt, was der Betreff ist, nicht was der Betreff tun kann.
CodingSoft

61

Ich habe jetzt schon oft Sicherheitsmodelle implementiert und musste mich auch mit diesen Konzepten auseinandersetzen. Nachdem ich es viele Male getan habe, ist hier mein Verständnis dieser Konzepte.

Was sind Rollen?

Rolle = Die Vereinigung von Benutzern und Berechtigungen.

Einerseits ist eine Rolle eine Sammlung von Berechtigungen. Ich nenne es gerne ein Berechtigungsprofil. Wenn Sie eine Rolle definieren, fügen Sie dieser Rolle im Grunde eine Reihe von Berechtigungen hinzu, sodass eine Rolle in diesem Sinne ein Berechtigungsprofil ist.

Andererseits ist eine Rolle auch eine Sammlung von Benutzern. Wenn ich Bob und Alice zur Rolle "Manager" hinzufüge, enthält "Manager" jetzt eine Sammlung von zwei Benutzern, die einer Gruppe ähneln.

Die Wahrheit ist, dass eine Rolle sowohl eine Sammlung von Benutzern als auch eine Sammlung von Berechtigungen ist. Optisch kann dies als Venn-Diagramm betrachtet werden.

Was ist eine Gruppe?

Gruppe = Sammlung von Benutzern

Eine "Gruppe" ist ausschließlich eine Sammlung von Benutzern. Der Unterschied zwischen einer Gruppe und einer Rolle besteht darin, dass eine Rolle auch eine Sammlung von Berechtigungen hat, eine Gruppe jedoch nur eine Sammlung von Benutzern.

Was ist eine Erlaubnis?

Erlaubnis = Was ein Fach tun kann

Was ist ein Berechtigungssatz?

Berechtigungssatz = Eine Sammlung von Berechtigungen

In einem robusten RBAC-System können Berechtigungen auch wie Benutzer gruppiert werden. Während Gruppen nur eine Sammlung von Benutzern sind, ist ein Berechtigungssatz nur eine Sammlung von Berechtigungen. Auf diese Weise kann ein Administrator ganze Sammlungen von Berechtigungen gleichzeitig zu Rollen hinzufügen.

Wie Benutzer, Gruppen, Rollen und Berechtigungen zusammenkommen

In einem robusten RBAC-System können Benutzer einer Rolle einzeln hinzugefügt werden, um die Sammlung von Benutzern in der Rolle zu erstellen, oder Gruppen können einer Rolle hinzugefügt werden, um der Rolle gleichzeitig eine Sammlung von Benutzern hinzuzufügen. In beiden Fällen erhält die Rolle ihre Benutzersammlung durch individuelles Hinzufügen oder durch Hinzufügen von Gruppen zur Rolle oder durch Hinzufügen einer Mischung aus Benutzern und Gruppen zur Rolle. Berechtigungen können auf die gleiche Weise gedacht werden.

Berechtigungen können Rollen einzeln hinzugefügt werden, um die Sammlung von Berechtigungen innerhalb der Rolle zu erstellen, oder Berechtigungssätze können einer Rolle hinzugefügt werden. Schließlich kann einer Rolle eine Mischung aus Berechtigungen und Berechtigungssätzen hinzugefügt werden. In beiden Fällen erhält die Rolle ihre Sammlung von Berechtigungen durch individuelles Hinzufügen oder durch Hinzufügen von Berechtigungssätzen zu einer Rolle.

Der gesamte Zweck von Rollen besteht darin, Benutzer mit Berechtigungen zu heiraten. Eine Rolle ist daher die UNION der Benutzer und Berechtigungen.

Was sind Ansprüche?

Behauptung = Was für ein Thema "ist"

Ansprüche sind KEINE Berechtigungen. Wie in früheren Antworten ausgeführt, ist ein Anspruch das, was ein Subjekt "ist", nicht das, was ein Subjekt "kann".

Ansprüche ersetzen keine Rollen oder Berechtigungen, sondern sind zusätzliche Informationen, anhand derer eine Autorisierungsentscheidung getroffen werden kann.

Wann Ansprüche geltend gemacht werden sollen

Ich habe festgestellt, dass Ansprüche nützlich sind, wenn eine Autorisierungsentscheidung getroffen werden muss, wenn der Benutzer nicht zu einer Rolle hinzugefügt werden kann oder die Entscheidung nicht auf der Zuordnung von Benutzer zu Berechtigung basiert. Das Beispiel eines Facebook-Nutzers verursacht dies. Ein Facebook-Benutzer ist möglicherweise nicht jemand, der einer "Rolle" hinzugefügt wurde. Es handelt sich lediglich um einen Besucher, der über Facebook authentifiziert wurde. Obwohl es nicht genau in RBAC passt, ist es eine Information, über die eine Autorisierungsentscheidung getroffen werden muss.

@CodingSoft hat die Metapher des Nachtclubs in einer früheren Antwort verwendet, die ich erweitern möchte. In dieser Antwort wurde der Führerschein als Beispiel verwendet, das eine Reihe von Ansprüchen enthielt, wobei das Geburtsdatum einen der Ansprüche darstellt und der Wert des DateOfBirth-Anspruchs zum Testen gegen die Autorisierungsregel verwendet wird. Die Regierung, die den Führerschein ausgestellt hat, ist die Behörde, die den Anspruch authentisch macht. In einem Nachtclub-Szenario überprüft der Türsteher an der Tür den Führerschein der Person und stellt sicher, dass er von einer vertrauenswürdigen Behörde ausgestellt wurde, indem er prüft, ob es sich um einen gefälschten Ausweis handelt (dh ein gültiger, von der Regierung ausgestellter Ausweis sein muss). Schauen Sie sich dann das Geburtsdatum an (einer der vielen Ansprüche auf einen Führerschein) und verwenden Sie diesen Wert, um festzustellen, ob die Person alt genug ist, um in den Club einzutreten. Wenn ja,

In Anbetracht dieser Basis möchte ich das jetzt noch weiter ausbauen. Angenommen, das Gebäude, in dem sich der Nachtclub befindet, enthält Büros, Räume, eine Küche, andere Stockwerke, Aufzüge, einen Keller usw., in die nur Mitarbeiter des Clubs eintreten können. Darüber hinaus haben bestimmte Mitarbeiter möglicherweise Zugriff auf bestimmte Orte, die andere Mitarbeiter möglicherweise nicht haben. Beispielsweise kann ein Manager Zugriff auf eine darüber liegende Büroetage haben, auf die andere Mitarbeiter keinen Zugriff haben. In diesem Fall gibt es zwei Rollen. Manager und Mitarbeiter.

Während der Zugang der Besucher zum öffentlichen Nachtclubbereich durch einen einzigen Anspruch, wie oben erläutert, autorisiert ist, benötigen Mitarbeiter per Rolle Zugang zu anderen nicht öffentlichen, eingeschränkten Räumen. Für sie reicht ein Führerschein nicht aus. Was sie brauchen, ist ein Mitarbeiterausweis, den sie scannen, um Türen zu betreten. Irgendwo gibt es ein RBAC-System, das Ausweise in der Manager-Rolle Zugriff auf die oberste Etage und Ausweise in der Mitarbeiterrolle Zugriff auf andere Räume gewährt.

Wenn aus irgendeinem Grund bestimmte Räume von Role hinzugefügt / entfernt werden müssen, kann dies mit RBAC erfolgen, dies ist jedoch nicht für einen Anspruch geeignet.

Berechtigungen in Software

Das Codieren von Rollen in die Anwendung ist eine schlechte Idee. Dadurch wird der Zweck der Rolle in der Anwendung fest codiert. Die Anwendung sollte nur Berechtigungen haben, die sich wie Feature-Flags verhalten. Wenn Feature-Flags durch Konfiguration zugänglich gemacht werden, werden Berechtigungen durch den Benutzersicherheitskontext zugänglich gemacht, der aus der DISTINCT-Sammlung von Berechtigungen abgeleitet wird, die aus allen Rollen erfasst wurden, in die der Benutzer eingefügt wurde. Dies nenne ich "effektive Berechtigungen". Die Anwendung sollte nur ein Menü anzeigenvon möglichen Berechtigungen für Funktionen / Aktionen. Das RBAC-System sollte die Aufgabe übernehmen, diese Berechtigungen über Rollen mit Benutzern zu verbinden. Auf diese Weise gibt es keine feste Codierung von Rollen, und eine Berechtigung ändert sich nur, wenn sie entfernt oder eine neue hinzugefügt wird. Sobald der Software eine Berechtigung hinzugefügt wurde, sollte diese niemals geändert werden. Es sollte nur bei Bedarf entfernt werden (dh wenn eine Funktion in einer neuen Version eingestellt wird) und es können nur neue hinzugefügt werden.

Eine letzte Anmerkung.

Grant vs Deny

Ein robustes RBAC-System und sogar ein CBAC-System sollten zwischen Zuschüssen und Ablehnungen unterscheiden.

Das Hinzufügen einer Berechtigung zu einer Rolle sollte entweder mit einem GRANT oder einem DENY erfolgen. Wenn Berechtigungen aktiviert sind, sollten alle GEWÄHRTEN Berechtigungen zur Benutzerliste der effektiven Berechtigungen hinzugefügt werden. Nach all dem sollte eine Liste der VERWEIGERTEN Berechtigungen das System veranlassen, diese Berechtigungen aus der Liste der effektiven Berechtigungen zu entfernen.

Auf diese Weise können Administratoren die endgültigen Berechtigungen eines Betreffs "optimieren". Es ist am besten, wenn Berechtigungen auch direkt zu Benutzern hinzugefügt werden können. Auf diese Weise können Sie einer Manager-Rolle einen Benutzer hinzufügen, der Zugriff auf alles erhält. Möglicherweise möchten Sie jedoch den Zugriff auf die Toilette der Dame verweigern, da der Benutzer ein Mann ist. Sie fügen also den männlichen Benutzer zur Manager-Rolle hinzu und fügen dem Benutzerobjekt mit DENY eine Berechtigung hinzu, sodass nur der Zimmerzugriff dieser Dame entfernt wird.

Eigentlich wäre dies ein guter Kandidat für einen Anspruch. Wenn der Benutzer den Anspruch "Geschlecht = männlich" hat, hat er in der Manager-Rolle Zugriff auf alle Räume, aber für die Toilette der Dame ist auch der Anspruch "Geschlecht = weiblich" und für die Toilette der Männer der Anspruch "Geschlecht = männlich" erforderlich. Auf diese Weise müsste man männlichen Benutzern keine DENY-Berechtigung konfigurieren, da die Claim-Durchsetzung dies für alle Benutzer mit einer einzigen Berechtigungsregel übernimmt. Es könnte jedoch so oder so gemacht werden.

Der Punkt ist, dass mit der VERWEIGERUNG von Berechtigungen die Verwaltung der Rollen vereinfacht wird, da Ausnahmen implementiert werden können.

Unten ist ein Diagramm, das ich vor langer Zeit erstellt habe und das das RBAC-Modell zeigt. Ich habe keine Grafik für die Ansprüche, aber Sie können sich vorstellen, dass es sich nur um Attribute handelt, die den Benutzern zugeordnet sind, wo immer sie sich befinden. Außerdem zeigt das Diagramm keine Gruppen (ich muss es irgendwann aktualisieren).

Ich hoffe das hilft.

Dies ist ein Diagramm des oben beschriebenen RBAC

Update am 7. April 2019 Basierend auf dem Feedback von @Brent (danke) ... wurden unnötige Verweise auf frühere Antworten entfernt und die ursprüngliche Grundlage der von @CodingSoft bereitgestellten "Nachtclub" -Metapher erläutert, um diese Antwort verständlich zu machen, ohne sie zu haben andere Antworten lesen.


3
Dies ist eine großartige Erklärung, die nach oben gestimmt werden sollte. Vielen Dank, dass Sie das Beispiel und das Diagramm hinzugefügt haben.
Optimae

1
Gute Antwort. Eine Empfehlung wäre, Verweise auf andere Antworten zu entfernen. Jede Antwort sollte für sich stehen, und obwohl ich die anderen Antworten lese, wird es nicht jeder tun.
Brent

Vielen Dank, Brent. Großartige Idee. Ich habe die Antwort durchgesehen und versucht, sie zu verbessern, indem ich unnötige Verweise auf andere Antworten entfernt und die Grundlage der Metapher des Nachtclubs erklärt habe, damit die andere Antwort nicht gelesen werden muss. Wenn Sie weitere Verbesserungsvorschläge haben, werde ich diese gerne umgehend anwenden. Danke noch einmal.
Ricardo

Einverstanden sollte dies die beste Antwort sein. Es gibt andere gute Antworten, aber diese ist die klarste und umfassendste und präziseste.
Matija Han

Das ist großartig und wird in normaler Sprache erklärt - danke
Spielzeug

49

Ich stimme Emrans Antwort nicht ganz zu

[Authorize(Roles="Sale")]

Ist naiv

Die Frage ist wie

  [Authorize(Roles="CustomerCreator")]

unterscheidet sich von

 [ClaimAuthorize(Permission="CanCreateCustomer")]

Wenn beide gleich gut sind, warum brauchen wir dann Anspruch?

Ich denke weil

Das Anspruchskonzept ist im Vergleich zu Role allgemeiner

Im Zusammenhang mit dem obigen Beispiel können wir sagen, dass "CustomerCreator" ein Anspruch vom Typ "Rolle" ist, der von "Asp.NETroleProvider" bereitgestellt wird.

Zusätzliche Beispiele für Ansprüche.

  1. "AAA" ist ein Anspruch vom Typ "MYExamSite.Score", der von "MYExamSite.com" bereitgestellt wird.

  2. "Gold" ist ein Anspruch vom Typ "MYGYM.Membershiptype", der von "MYGYMApp" bereitgestellt wird.


8
Ich denke, diese Antwort hat Wert, da sie den grundlegenden Unterschied zwischen einem Anspruch und seiner äquivalenten Rolle anspricht, anstatt ein Szenario zu beschreiben, das entweder mit einem Anspruch oder einem rollenbasierten Autorisierungsmodell effektiv implementiert werden kann. +1
Katstevens

1
Ich habe meine Antwort kommentiert. Ich sagte, es hängt davon ab, wie Sie "Rolle" in Ihrer Organisation definieren. Sie können eine Rolle definieren, die nach Berechtigung / oder Anspruch klingt. Dieser Ansatz wird Sie nicht davon abhalten, dasselbe Ziel zu erreichen. ROLLE bedeutet normalerweise "Termin"; So werden die verwendeten Begriffe verwendet. Der Unterschied liegt im Konzept, eher in der Technologie. Wenn Sie [Authorize (Roles = "CustomerCreator")] verwenden, ähnelt es CBAC im abstrakten Sinne. In der Debatte geht es darum, ob Sie in Ihrem Sicherheitsmodell Termine oder Mico-Berechtigungen erstellen sollten. Bei Claim geht es nicht nur um Berechtigungen, sondern um mehr.
Emran Hussain

So werden Rollen in MSSQL ausgeführt. Es hat DBDataReader und DBDataWriter, nicht MyAppDB und HisAppDB.
Behrooz

Wie bedeuten Rollen Ernennung? In RBAC werden Rollen mit Berechtigungen zugewiesen.
Wouter

46

Die akzeptierte Antwort scheint Rollen als stumpfes Objekt und Ansprüche als flexibles Werkzeug zu positionieren, lässt sie aber ansonsten nahezu identisch erscheinen. Leider ist diese Positionierung für das Konzept der Ansprüche von Nachteil und kann grundsätzlich ein leichtes Missverständnis ihres Zwecks widerspiegeln.

Rollen existieren und sind nur in einem impliziten Bereich sinnvoll. Im Allgemeinen ist dies eine Anwendung oder ein Organisationsbereich (dh Rolle = Administrator). Ansprüche können dagegen von jedermann "geltend gemacht" werden. Beispielsweise kann die Google-Authentifizierung Ansprüche einschließlich der "E-Mail" eines Nutzers hervorrufen und diese E-Mail an eine Identität anhängen. Google macht den Anspruch geltend, die Anwendung entscheidet, ob dieser Anspruch verstanden und akzeptiert wird. Die Anwendung selbst kann anschließend einen Anspruch mit dem Namen "Authentifizierungsmethode" (wie dies bei ASP.NET MVC Core Identity der Fall ist) mit dem Wert "Google" anhängen. Jeder Anspruch enthält einen Geltungsbereich, sodass festgestellt werden kann, ob ein Anspruch extern, lokal oder beides eine Bedeutung hat (oder je nach Bedarf feinkörniger).

Die wichtigsten Punkte sind, dass alle Ansprüche explizit an eine Identität gebunden sind und einen expliziten Geltungsbereich enthalten. Diese Ansprüche können natürlich für die Autorisierung verwendet werden - und ASP.NET MVC unterstützt dies über das Attribut "Autorisieren", aber dies ist nicht der einzige oder notwendigerweise sogar primäre Zweck für Ansprüche. Es unterscheidet es sicherlich nicht von Rollen, die für die Berechtigung mit lokalem Gültigkeitsbereich genauso verwendet werden können.

Man kann also wählen, ob Rollen oder Ansprüche oder beides zum Zweck der Autorisierung verwendet werden sollen, und wahrscheinlich auch keinen inhärenten Vor- oder Nachteil finden, solange diese Rollen und Ansprüche lokal sind. Wenn die Autorisierung beispielsweise von externen Identitätsansprüchen abhängt, sind die Rollen unzureichend. Sie müssten den externen Anspruch akzeptieren und ihn in eine Rolle mit lokalem Gültigkeitsbereich übersetzen. Daran ist nicht unbedingt etwas auszusetzen, aber es führt eine Ebene der Indirektion ein und verwirft den Kontext.


3
Gute Antwort ... Ich glaube, ich verstehe Sie ..., aber es wäre klarer, wenn Sie ein konkretes Beispiel liefern könnten (möglicherweise im ASP MVC-Kontext) ... die Antwort ist zu abstrakt. Es fällt mir schwer, meinen Kopf zu wickeln um es herum.
Rosdi Kasim

2
Der zweite Absatz enthält ein konkretes Beispiel für die ASP.NET MVC Core Identity und die Google-Authentifizierung. Es hört sich so an, als würde ein detaillierterer Durchgang durch das neue Modell von Core helfen - dafür empfehle ich diesen Artikel: andrewlock.net/introduction-to-authentication-with-asp-net-core
Hanf

Beste Antwort IMHO
mrmashal

8

Im weiteren Sinne sollten Sie die attributbasierte Zugriffskontrolle (ABAC) in Betracht ziehen. RBAC und ABAC sind beide Konzepte, die vom NIST, dem National Institute of Standards and Technology, definiert wurden. CBAC hingegen ist ein von Microsoft entwickeltes Modell, das ABAC sehr ähnlich ist.

Lesen Sie hier mehr:


3
Die Empfehlung zur Verwendung der Attribut-basierten Zugriffskontrolle ist zwar großartig. Links zu allgemeinen / Best Practices für die Implementierung dieser in den MVC / WebAPI-Stacks wären nett. Vielen Dank
Itanex

6

Das Grundlegende zwischen RBAC und CBAC ist Folgendes:

RBAC : Ein Benutzer muss einer Rolle zugewiesen sein, um zur Ausführung einer Aktion berechtigt zu sein.

CBAC : Der Benutzer muss einen Anspruch mit dem korrekten Wert haben, wie von der Anwendung erwartet, um autorisiert zu werden. Die anspruchsbasierte Zugriffskontrolle ist elegant zu schreiben und einfacher zu warten.

Darüber hinaus werden Ansprüche an die Anwendung von einem ausstellenden Autorisierungsdienst (Security Service Token STS) ausgestellt, dem Ihre Anwendung vertraut (vertrauende Partei).


6

Die Rolle ist nur eine Art von Anspruch. Auf diese Weise kann es viele andere Anspruchstypen geben, z. B. ist der Benutzername einer der Anspruchstypen


6

Es ist wichtig, zuerst zu analysieren, wofür die Authentifizierung erforderlich ist, bevor Sie entscheiden, welche Methode die beste ist. In der folgenden Microsoft-Dokumentation heißt es: "Ein Anspruch ist nicht das, was der Betreff tun kann. Beispielsweise verfügen Sie möglicherweise über einen Führerschein, der von einer örtlichen Führerscheinbehörde ausgestellt wurde. Auf Ihrem Führerschein ist Ihr Geburtsdatum angegeben. In diesem Fall Der Anspruchsname wäre DateOfBirth, der Anspruchswert wäre Ihr Geburtsdatum, beispielsweise der 8. Juni 1970, und der Aussteller wäre die Führerscheinbehörde. Die anspruchsbasierte Berechtigung prüft im einfachsten Fall den Wert eines Anspruchs und ermöglicht den Zugriff auf Eine Ressource, die auf diesem Wert basiert. Wenn Sie beispielsweise Zugang zu einem Nachtclub wünschen, lautet der Autorisierungsprozess möglicherweise wie folgt: 6 "

Anhand dieses Beispiels können wir sehen, dass der Zugriff auf einen Nachtclub mit einer anspruchsbasierten Autorisierung anders ist als die Art der Autorisierung, die von den Mitarbeitern des Nachtclubs benötigt wird. In diesem Fall benötigen die Mitarbeiter des Nachtclubs Eine rollenbasierte Autorisierung, die für die Besucher des Nachtclubs nicht erforderlich ist, da die Besucher des Nachtclubs alle einen gemeinsamen Zweck im Nachtclub haben. In diesem Fall ist eine anspruchsbasierte Autorisierung für die Besucher des Nachtclubs geeignet.

Rollenbasierte Autorisierung https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles 14.10.2016 Wenn eine Identität erstellt wird, kann sie zu einer oder mehreren Rollen gehören. Beispielsweise kann Tracy zu den Administrator- und Benutzerrollen gehören, während Scott möglicherweise nur zur Benutzerrolle gehört. Wie diese Rollen erstellt und verwaltet werden, hängt vom Sicherungsspeicher des Autorisierungsprozesses ab. Rollen werden dem Entwickler über die IsInRole-Methode für die ClaimsPrincipal-Klasse zur Verfügung gestellt.

Anspruchsbasierte Autorisierung https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims 14.10.2016 Wenn eine Identität erstellt wird, können ihr ein oder mehrere Ansprüche zugewiesen werden, die von einer vertrauenswürdigen Partei ausgestellt wurden. Ein Anspruch ist ein Name-Wert-Paar, das darstellt, was das Subjekt ist, nicht was das Subjekt tun kann. Beispielsweise verfügen Sie möglicherweise über einen Führerschein, der von einer örtlichen Führerscheinbehörde ausgestellt wurde. Auf Ihrem Führerschein steht Ihr Geburtsdatum. In diesem Fall wäre der Anspruchsname DateOfBirth, der Anspruchswert wäre Ihr Geburtsdatum, beispielsweise der 8. Juni 1970, und der Aussteller wäre die Führerscheinbehörde. Die auf Ansprüchen basierende Autorisierung überprüft im einfachsten Fall den Wert eines Anspruchs und ermöglicht den Zugriff auf eine Ressource, die auf diesem Wert basiert. Wenn Sie beispielsweise Zugang zu einem Nachtclub wünschen, lautet der Autorisierungsprozess möglicherweise wie folgt:

Der Türsicherheitsbeauftragte bewertet den Wert Ihres Geburtsdatums und ob er dem Aussteller (der Führerscheinbehörde) vertraut, bevor er Ihnen den Zugang gewährt.

Eine Identität kann mehrere Ansprüche mit mehreren Werten und mehrere Ansprüche desselben Typs enthalten.


2

Es ist auch möglich, Rollen auf Anspruchsart zu verwalten.

Anstatt Berechtigungsrollen zu erstellen, die eine Geschäftsrolle widerspiegeln, erstellen Sie Rollen, die Aktionsrollen widerspiegeln, z. B. CreateCustomer, EditCustomer, DeleteCustomer. Kommentieren Sie die Methoden nach Bedarf.

Es ist nicht einfach, Personen einer Reihe von Aktionsrollen zuzuordnen, insbesondere wenn die Rollenliste größer wird. Daher müssen Sie die Geschäftsrollen auf einer niedrigeren Granularitätsebene (z. B. Vertrieb, Marketing) verwalten und die Geschäftsrolle den erforderlichen Aktionsrollen zuordnen. Fügen Sie einer Geschäftsrolle einen Benutzer hinzu, und ordnen Sie ihn den erforderlichen (Aktions-) Rollen in der vorhandenen Berechtigungstabelle zu.

Sie können sogar die Geschäftsrolle überschreiben und eine Person direkt zu einer Aktionsrolle hinzufügen.

Da Sie auf dem aufbauen, was bereits funktioniert, machen Sie den vorhandenen Autorisierungsprozess nicht rückgängig. Sie benötigen nur noch wenige Tabellen, um diesen Ansatz zu implementieren


1

Ich denke, diese Frage könnte aus der Datenbank-Perspektive beantwortet werden. Wenn Sie bemerkt haben, wie die Tabellen an dieser Implantation beteiligt sind, finden Sie Folgendes

  1. AspNetUsers: Jeder Benutzer hat eine Zeile mit allen Attributen, die von allen Benutzern benötigt werden, wie E-Mail, Adresse, Telefon, Passwort .....
  2. AspNetRoles; definiert verschiedene Rollen gemäß den Anwendungsanforderungen wie GM, CTO, HRM, ADMIN, EMP. Was jede Rolle definiert, entspricht den Anforderungen der Anwendung.
  3. AspNetUserRoles: Jede Zeile verknüpft AspNetUsers und AspNetRoles und verknüpft effektiv einen Benutzer mit mehreren Rollen.
  4. AspNetUserClaims: Jede Zeile enthält einen Schlüssel für AspNetUsers sowie einen Typ und einen Wert. Fügen Sie also effektiv ein Attribut für jeden Benutzer hinzu, das zur Laufzeit hinzugefügt / entfernt werden kann.

Die Verwendung dieser Tabellen kann zu einem bestimmten Zeitpunkt der Benutzer- / Anwendungslebensdauer angepasst werden, um bestimmten Anforderungen zu entsprechen.

Betrachten wir die frühe Phase von "Purchasing Manager" (PM), könnten wir drei Ansätze haben

  1. Die Anwendung füllt AspNetUserRoles mit einer Zeile, um dem PM das Kaufrecht zu gewähren. Um eine Bestellung mit einem beliebigen Betrag auszustellen, benötigt der Benutzer nur die Rolle "PM".

  2. Die Anwendung füllt AspNetUserRoles mit einer Zeile, um das Kaufrecht "PM" zu gewähren, und füllt die AspNetUserClaims mit einem Anspruch vom Typ "Kaufbetrag" und dem Wert "<1000", um das Betragslimit festzulegen. Um eine Bestellung ausstellen zu können, muss der Benutzer "PM" haben und der Bestellbetrag muss unter dem Anspruchswert des Anspruchs TYP "Einkaufsbetrag" liegen.

  3. Die Anwendung füllt AspNetUserClaims mit dem Anspruch vom Typ 'Einkaufsbetrag' und dem Wert "<1000". Jeder Benutzer kann eine Bestellung ausstellen, wenn der Betrag unter dem Anspruchswert des Anspruchs TYP 'Einkaufsbetrag' für diesen Benutzer liegt.

Wie zu bemerken war, ist rollenbasiert grobkörnig von starren Rechten, die das Leben des Anwendungsbenutzers aus Sicht der Systemverwaltung vereinfachen würden. Dies schränkt jedoch die Benutzerfähigkeiten aus Sicht der Geschäftsanforderungen ein. Auf der anderen Seite basieren Ansprüche auf sehr feinen Rechten, die jedem Benutzer zugewiesen werden müssen. Claim Based wird das Geschäft ebenfalls an seine Grenzen bringen, das Systemmanagement jedoch sehr komplex machen.


0

Rollenbasierte Zugriffskontrolle (RBAC)

In Ihrer Organisation haben Sie möglicherweise die folgenden Rollen

Mitarbeiter

Manager

HR

Abhängig von der Rolle oder den Rollen, zu denen der angemeldete Benutzer gehört, können Sie den Zugriff auf bestimmte Ressourcen in der Anwendung autorisieren oder nicht. Da wir Rollen verwenden, um Berechtigungsprüfungen durchzuführen, wird dies üblicherweise als rollenbasierte Zugriffssteuerung (RBAC) oder rollenbasierte Autorisierung bezeichnet.

In ASP.NET Core verwenden wir zum Implementieren der rollenbasierten Autorisierung das Attribut Authorize mit dem Parameter Roles.

[Authorize(Roles = "Admin")]
public class AdministrationController : Controller
{
}

Anspruchsbasierte Zugangskontrolle (CBAC)

WAS ist Anspruch? Ein Anspruch ist ein Name-Wert-Paar. Es ist wirklich eine Information über den Benutzer, nicht was der Benutzer tun kann und was nicht. Zum Beispiel sind Benutzername, E-Mail, Alter, Geschlecht usw. alle Ansprüche. Wie Sie diese Ansprüche für Autorisierungsprüfungen in Ihrer Anwendung verwenden, hängt von Ihrem Anwendungsgeschäft und Ihren Autorisierungsanforderungen ab.

Wenn Sie beispielsweise ein Mitarbeiterportal erstellen, können Sie dem angemeldeten Benutzer gestatten, einen Mutterschaftsurlaub zu beantragen, wenn der Wert für den geschlechtsspezifischen Anspruch weiblich ist. Wenn Sie eine E-Commerce-Anwendung erstellen, können Sie dem angemeldeten Benutzer auch erlauben, eine Bestellung abzugeben, wenn der Wert für den Altersanspruch größer oder gleich 18 ist.

Ansprüche basieren auf Richtlinien. Wir erstellen eine Richtlinie und fügen einen oder mehrere Ansprüche in diese Richtlinie ein. Die Richtlinie wird dann zusammen mit dem Richtlinienparameter des Attributs Authorize verwendet, um eine anspruchsbasierte Autorisierung zu implementieren.

[Authorize(Policy = "DeleteRolePolicy")]
public async Task<IActionResult> DeleteRole(string id)
{
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.