ASP.NET Identity, fügen Sie sofort einen anderen Benutzer zur Rolle hinzu (sie müssen sich nicht abmelden und wieder ein)

8

Zunächst einmal, ich bin mir dessen bewusst diese Frage: MVC 5 AddToRole erfordert Abmeldung, bevor es funktioniert?

und diese: Was ist ASP.NET Identität des IUserSecurityStampStore & lt; TUser & gt; Schnittstelle?

Bitte markieren Sie dies nicht als Duplikat.

Ich versuche, einen anderen Benutzer zu einer Rolle hinzufügen (dh der Benutzer wir auf die Rolle sind Zugabe ist nicht der aktuelle Benutzer. Wenn sie sind, ich die Antwort auf erste Frage im Zusammenhang mit ausreichend ist.)

Wie so:

%Vor%

Die zwei Situationen, in denen ich das mache, sind: von einer Admin-Seite, wo der aktuelle Benutzer der Administrator ist; und ein Webhook, der mit der Standardauthentifizierung gesichert ist (wo es keinen aktuellen Benutzer gibt).

Das Problem: Wenn der Benutzer, dass diese Änderung in protokolliert bezieht und mit Hilfe der App, ich brauche die Änderung „add to Rolle“ sofort anzuwenden. Sie sollten sich nicht aus- und wieder anmelden müssen, damit die Veränderung eintritt, und es muss sofort geschehen.

Danke allen.

BEARBEITEN: Übrigens erfordert User.IsInRole (roleName) Abmeldung und Anmeldung, um der neuen Rolle hinzugefügt zu werden. UserManager.IsInRole (userID, rolename) nicht, weil (ich nehme an) es direkt in die Datenbanktabellen geht zu überprüfen. Aber wenn der Benutzer eine Aktion-Methode mit der Rolle gesichert Hits haben sie nur hinzugefügt worden ist, sie müssen noch wieder anmelden, die fair genug ist. Immer noch neugierig, ob es einen Weg gibt.

BEARBEITEN: Hier ist der Quellcode für das Autorize-Attribut: Ссылка

Es verwendet User.IsInRole, weswegen wir uns erneut anmelden müssen. Es scheint, dass die Methode zum Überschreiben ist AuthorizeCore (HttpContextBase httpContext). Ich bin nicht tapfer oder gut genug, um mich gerade mit diesem Problem zu beschäftigen, aber wenn du es ausprobieren willst, werden viele Leute das hilfreich finden.

    
nmit026 21.04.2016, 10:01
quelle

2 Antworten

4

Ausgehend von der Unterseite Ihrer Frage. User.IsInRole() geht in den Benutzer-Cookie und überprüft, welche Rollen in diesem Cookie gespeichert sind. Daher müssen Änderungen erneut vorgenommen werden, damit Änderungen wirksam werden. Und ja, Sie haben recht, wenn Sie sagen, dass UserManager.IsInRole() mit der Datenbank abgleicht, nicht mit dem Cookie.

Um sicherzustellen, dass Rollenänderungen sofort angewendet werden, müssen Sie bei jeder Anfrage nach Rollenänderungen suchen. Um dies zu tun in Startup.Auth.cs finde diese Zeile:

%Vor%

Dies ist die Art und Weise, wie ein Framework Cookies aktualisiert. Standardmäßig ist validateInterval auf 30 Minuten eingestellt. Wenn Sie ihn auf Null setzen, erstellt das System bei jeder Anfrage ein neues Cookie mit aktualisierten Rollen. Dies kann zu viel DB-Last sein, wenn Sie genug Benutzer gleichzeitig auf Ihrem System haben. Also würde ich die Zeitspanne auf 30 Sekunden 1-2 Minuten erhöhen.

Diese Funktion wurde entwickelt, um alle Sitzungen durch eine einzige Passwortänderung abzumelden. Aber funktioniert auch gut für Ihre Zwecke.

    
trailmax 22.04.2016, 00:35
quelle
2

In ASP.NET Core löst SignInManager.RefreshSignInAsync () dies.

    
chadwackerman 04.05.2017 00:00
quelle