2016-05-16 4 views
9

Net Core Policy Authorisation, aber es sieht sehr statisch für mich aus. Weil in der Unternehmensanwendung häufig neue Rollen benötigt werden, die neue Richtlinien benötigen (soweit ich weiß) oder wenn Sie neue Richtlinien für bestimmte Clients implementieren möchten. Wenn wir zum Beispiel ein CMS erstellen, das von diesen Richtlinien gesteuert wird, wollen wir, dass jeder Client in der Lage ist, eigene zu definieren. Kann dieser neue politische Basismechanismus also dynamischer sein oder ist seine Idee ganz anders?Kann die richtlinienbasierte Autorisierung dynamischer sein?

Dank :))

+0

Bevor ich folgende Frage stellte, dachte ich wie du. (http://stackoverflow.com/questions/36445780/how-to-implement-permission-based-access-control-with-asp-net-core). Aber @ Tsengs Antwort hat meine Meinung geändert. Die Antwort zeigt, dass "Richtlinienautorisierung" dynamisch verwendet werden kann. Werfen Sie einen Blick auf die Antwort, es könnte für Ihren Fall nützlich sein. –

+0

Sie sollten keine "Rollen" mehr verwenden (wie zuvor in ASP.NET 4.5/MVC 5 verwendet), sondern stattdessen Ansprüche verwenden. Rollen sind nicht sehr flexibel und erfordern, dass Sie Ihren Code jedes Mal ändern, wenn Sie eine neue Rolle hinzufügen.Eine Reklamation ist eine spezifische Berechtigung, die auf einer Funktion Ihrer Anwendung basiert, zB "ReadArticle" oder "WriteArticle", "DeleteArticle", "CreateUser" usw. Auf diese Weise müssen Sie nur eine Richtlinie hinzufügen, wenn Sie eine neue Funktion hinzufügen Fähigkeit, Benutzer zu verwalten oder Artikel zu veröffentlichen). Eine "Rolle wäre einfach nur eine Sammlung von Ansprüchen, die ein Benutzer hat, wenn er sich anmeldet. Dann überprüfen Sie es in der Richtlinie – Tseng

+1

Denken Sie daran, Sie können keine dynamische Richtlinie erstellen, wenn es noch keine gab kann dem Benutzer nicht erlauben, eine "Überalterung von 18" -Richtlinien zu spezifizieren, wenn es keinen Code im Backend gibt, der ihn handhabt (dh 'AgeOver18'-Richtlinie und Handler, der das Alter des Benutzers überprüft) Sie werden von einem Nichtentwickler oder jemandem erstellt, der keinen Zugriff auf den Quellcode hat (da Sie dieser Richtlinie im Code Prüfungen hinzufügen müssen.) Anstatt eine neue Richtlinie zu erstellen, erstellen Sie eine Rolle als eine Sammlung von bestehende Richtlinien/Berechtigungen – Tseng

Antwort

13

Ich empfehle immer, dass die Menschen @ the least privilege repo einen Blick darauf werfen, wie es einige großartige Beispiele für die verschiedenen Ansätze hat man mit dem neuen ASP.NET Core- Authentifizierung und Autorisierung Paradigmen nehmen .

Kann dieser neue Richtlinienbasismechanismus dynamischer sein?

Ja, in der Tat ist es dynamischer als die vorherigen rollenbasierten Konzepte. Sie können Richtlinien definieren, die datengesteuert sein können. Here ist eine weitere große Quelle für Details dazu. Sie können angeben, dass beispielsweise ein API-Einstiegspunkt durch eine Richtlinie geschützt ist, und dass diese Richtlinie einen Handler haben kann und dieser Handler alles tun kann, was er benötigt, d.h. Untersuchen Sie die aktuelle User im Kontext, vergleichen Sie Ansprüche mit Werten in der Datenbank, Rollen vergleichen, alles wirklich. Betrachten Sie die following:

einen Einstiegspunkt definieren mit dem Policy

[Authorize(Policy = "DataDrivenExample")] 
public IActionResult GetFooBar() 
{ 
    // Omitted for brevity... 
} 

Fügen Sie die Genehmigung mit den Optionen, die die Richtlinie hinzuzufügen.

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc();  
    services.AddAuthorization(options => 
    { 
     options.AddPolicy("DataDrivenExample", 
          policy => 
          policy.Requirements.Add(new DataDrivenRequirement())); 
    });  
    services.AddSingleton<IAuthorizationHandler, DataDrivenHandler>(); 
} 

Dann definieren Sie den Handler.

public class MinimumAgeHandler : AuthorizationHandler<DataDrivenRequirement> 
{ 
    protected override void Handle(AuthorizationContext context, 
            DataDrivenRequirement requirement) 
    { 
     // Do anything here, interact with DB, User, claims, Roles, etc. 
     // As long as you set either: 
     // context.Succeed(requirement); 
     // context.Fail(); 
    } 
} 

Ist die Idee ganz anders?

Es sollte sehr ähnlich fühlen zu den bisherigen Konzepten, die Sie gewohnt sind, mit auth8 und authz.

+0

Vielen Dank das ist wirklich alles, was ich wissen musste :))) –

6

Die akzeptierte Antwort ist immer noch ziemlich begrenzt. Dynamische Werte auf der Controller- und Action-Ebene sind nicht zulässig. Die einzige Stelle, an der ein benutzerdefinierter Wert hinzugefügt werden könnte, ist die Anforderung, wenn die Richtlinie hinzugefügt wird. Manchmal benötigen Sie eine feinere Kontrolle über den Autorisierungsprozess. Ein sehr häufiges Szenario ist die Erlaubnis basierte Sicherheit. Jeder Controller und jede Aktion sollte in der Lage sein, die Berechtigungen anzugeben, die für den Zugriff auf sie erforderlich sind. Siehe meine Antwort here für eine leistungsfähigere Lösung, mit der Sie benutzerdefinierte Attribute verwenden können, um Ihre Controller und Aktionen mit allen Informationen zu dekorieren, die Sie während der Autorisierung benötigen.

+0

https://github.com/aspnet/Security/issues/1359 sollte dies ansprechen – thekip

Verwandte Themen