Wie stelle ich die Laufzeitauthentifizierung in ASP.NET Core ein?

8

Ich erstelle eine Anwendung, indem es eine rollenbasierte Modulverwaltung gibt, die jederzeit geändert wird. Szenario:

  • Wenn ein Benutzer Zugriff zum Erstellen und Anzeigen von Mitarbeitern hat, kann ein Benutzer nur Mitarbeiter erstellen und anzeigen, aber in Zukunft kann der Administrator die Benutzerrolle von Erstellen und Anzeigen zum Anzeigen und Löschen ändern, als ein Benutzer nur diese Aktivität ausführen kann.

Ich versuche es mit, [Authorize(Roles ="Staff")]aber wenn der Administrator die Laufzeit ändert, wird sie nicht verwaltet.

Kann jemand das untersuchen und sich bei mir melden?

Deep Soni
quelle
Authorize(Roles ="Staff")stellt sicher, dass nur Benutzer mit Rolle Staffauf diese Aktion zugreifen können. Wenn der Benutzer aus dieser Rolle entfernt wird, kann der Benutzer nicht darauf zugreifen. Geschieht dies nicht?
Chetan Ranpariya
Soweit ich weiß, ist dies nicht möglich und vielleicht keine gute Idee. Benutzer sollten sich abmelden und wieder anmelden, damit die neuen Rollen angewendet werden können. Sie können die Seite sogar anders rendern.
Emad
Angenommen, Sie verwenden ein Cookie- oder JWT-Inhaber-Token: Die Ansprüche / Rollen des Benutzers bleiben im Cookie / Token erhalten. Sie müssen den Benutzer abmelden und den Benutzer erneut anmelden, um sicherzustellen, dass er ein neues Cookie / Token erhält.
Itminus
Hallo, @itminus Derzeit ist die Anfangsphase läuft so zu einem Zeitpunkt von Login - Benutzer erhalten die Rolle und die verfügbaren Rollen Liste wie Create Employee, View Employeeund @Emad Ja ich Notwendigkeit ändert sich zum Zeitpunkt der Anmeldung , ob es irgendwelche Änderungen während der Live - Session sind dann gibt es keine in einer Rolle beeinflussen. Ist es möglich?
Deep Soni
@DeepSoni können wir benutzerdefinierte Autorisierungsattribute implementieren, um diese Anforderung zu erfüllen. Bitte schlagen Sie vor, damit wir weitermachen können.
Jishan Siddique

Antworten:

1

Dies ist eine komplizierte Frage und es gibt keine richtige Antwort, aber es gibt verschiedene Möglichkeiten, dies zu tun. Zunächst gehe ich davon aus, dass Sie die zustandslose Authentifizierung mit einem auf Ansprüchen basierenden JWT verwenden. Der einfachste Weg besteht darin, eine eigene Richtlinie zu schreiben , die Benutzerrollen vor jeder Anforderung liest. Dies ist der einfachste Weg, dies zu tun und am schnellsten zu implementieren.

internal class DatabaseRoles : IAuthorizationRequirement
    {
        public string Role { get; }

        public DatabaseRoles(string role)
        {
            Role = role;
        }
    }

    internal class DatabaseRolesHandler : AuthorizationHandler<DatabaseRoles>
    {
        private readonly UserManager<IdentityUser> userManager;

        public DatabaseRolesHandler(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            this.userManager = userManager;
        }

        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, DatabaseRoles requirement)
        {
            //NOTE this is the out of the box implementation of roles and simple query to get the roles from the EF backed database. I would recoment makeing a custom privelages store for this and not using roles for this but access rights
            var user = await userManager.FindByIdAsync(userManager.GetUserId(context.User));
            if (await userManager.IsInRoleAsync(user, requirement.Role))
            {
                context.Succeed(requirement);
            }
        }

    }

Diese Lösung ist jedoch nicht so leistungsfähig, da bei jeder Anforderung ein Aufruf der Datenbank erforderlich ist. Dies ist bei kleinen Lasten in Ordnung, kann jedoch zu Verkehrsproblemen führen. Die andere Möglichkeit besteht darin, alle Benutzertoken erneut aufzurufen, wenn sich die Rollen ändern. Dies ist jedoch sehr kompliziert. Ich bin sicher, wenn Sie einen Schnellzugriffsspeicher für Rollen wie Redis erstellen, gibt es keine Probleme, die Überprüfung bei jedem Anruf durchzuführen. Außerdem empfehle ich nicht, einen eigenen Benutzerspeicher zu erstellen, da es ein Albtraum ist, die Sicherheitsstandards aufrechtzuerhalten und auf dem neuesten Stand zu halten.

Filip Cordas
quelle
Hallo, danke für deine Antwort. Ich habe es mit Ihrer Lösung versucht, aber bei jeder Verarbeitung von Index, Erstellen, Bearbeiten oder jeder anderen Operation, die diese Methode aufruft, ist ein Problem: Wenn ein Dashboard öffentlich verfügbar ist, wird diesem bestimmten Modul keine Rolle zugewiesen, dies ist jedoch nicht der Fall sichtbar für jeden gemäß Ihrem Code.
Deep Soni
@DeepSoni Nur eine Sache, um auf den Code hinzuweisen, wenn demonstrative nicht empfehlen würde, ihn so zu verwenden, wie er ist. Sie sollten dies an Ihre Bedürfnisse anpassen. Der Punkt hierfür ist als Beispiel für eine ressourcenbasierte Authentifizierung . Die Abfrage sollte Ihre Datenbank mit der Benutzer-ID mit einer benutzerdefinierten Abfrage überprüfen.
Filip Cordas
Danke für die Antwort. Lassen Sie mich mit Ihrer Referenz und Lösung versuchen.
Deep Soni
Ich versuche es derzeit, wenn ich auf Microsoft Doc für die ressourcenbasierte Autorisierung verweise, dann kann ich IDocumentRepositoryes nicht verwenden. Es zeigt mir, wie ich UmbracoCMS installiere. Können Sie bitte herausfinden?
Deep Soni
O also, es ist eine UmbracoCMS-spezifische Frage. Ich bin wirklich nicht so vertraut damit. Es ist vielleicht am besten, ein UmbracoCMS-Tag und einen Code hinzuzufügen, den Sie versucht haben, damit jemand mit Erfahrung es sich ansieht. Aber soweit ich das beurteilen kann, sollte es überall funktionieren, solange Sie die richtige Abfrage an UmbracoCMS senden.
Filip Cordas
-1

Wenn Sie Sitzung / Cookie zum Speichern der angemeldeten Benutzerdetails verwenden, können Sie die Details leeren, wenn der Administrator Rollenänderungen vornimmt. Bei jeder Aktion können Sie die Rolle in Sitzung / Cookie überprüfen und fortfahren. Sobald der Benutzer auf eine beliebige Stelle auf dem Bildschirm klickt, die auf den Controller trifft. Die Bedingung wird überprüft und der Benutzer wird abgemeldet, da das Sitzungs- / Cookie-Objekt leer ist.

Bansari Soni
quelle
Hallo @BansariSoni. Danke für die Antwort. Es ist nicht sinnvoll, die Sitzung jedes Mal zu entfernen und nach der Anmeldung beim Benutzer zu fragen. Es ist nur wie ein Patch (behoben) in der Anwendung, also brauche eine richtige Antwort, die sogar akzeptabel ist, oder einen Hinweis, um die Antwort herauszufinden.
Deep Soni
Wenn die Rolle in der Sitzung ist, kann ich meiner Meinung nach nur zwei Optionen verwenden, um entweder die Sitzungsvariable zu ändern oder sie zu entfernen. Hier können Sie eine andere Sache tun, z. B. wenn der Administrator die Rolle wechselt. Sie können überprüfen, ob diese Benutzer-ID in der Sitzung vorhanden ist, wenn ja, als ein Flag in der Sitzung setzen. Anschließend können Sie einen Cron-Job erstellen, der die Seite nur alle 5 Minuten aktualisiert, wenn dieses bestimmte Flag wahr ist.
Bansari Soni