Ich verwende die OWIN-Authentifizierung für mein MVC5-Projekt. Das ist meinSignInAsync
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
var AccountNo = "101";
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
identity.AddClaim(new Claim(ClaimTypes.UserData, AccountNo));
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent, RedirectUri="Account/Index"}, identity);
}
Wie Sie sehen können, habe ich AccountNo
in die Anspruchsliste aufgenommen.
Wie kann ich diesen Anspruch irgendwann in meiner Bewerbung aktualisieren? Bisher habe ich Folgendes:
public string AccountNo
{
get
{
var CP = ClaimsPrincipal.Current.Identities.First();
var Account= CP.Claims.FirstOrDefault(p => p.Type == ClaimTypes.UserData);
return Account.Value;
}
set
{
var CP = ClaimsPrincipal.Current.Identities.First();
var AccountNo= CP.Claims.FirstOrDefault(p => p.Type == ClaimTypes.UserData).Value;
CP.RemoveClaim(new Claim(ClaimTypes.UserData,AccountNo));
CP.AddClaim(new Claim(ClaimTypes.UserData, value));
}
}
Wenn ich versuche, den Anspruch zu entfernen, erhalte ich diese Ausnahme:
Der Anspruch " http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata : 101" konnte nicht entfernt werden. Es ist entweder nicht Teil dieser Identität oder es ist ein Anspruch des Auftraggebers, der diese Identität enthält. Beispielsweise besitzt der Principal den Anspruch, wenn er einen GenericPrincipal mit Rollen erstellt. Die Rollen werden durch die Identität verfügbar gemacht, die im Konstruktor übergeben wird, aber nicht tatsächlich der Identität gehört. Eine ähnliche Logik gibt es für einen RolePrincipal.
Könnte mir jemand helfen, herauszufinden, wie ich den Anspruch aktualisieren kann?
SignInManager.SignInAsync
, um den Wert des Anspruchs zu aktualisieren . Siehe diese FrageAntworten:
Ich habe eine Erweiterungsmethode zum Hinzufügen / Aktualisieren / Lesen von Ansprüchen basierend auf einer bestimmten ClaimsIdentity erstellt
und dann zu benutzen
quelle
Sie können eine neue erstellen
ClaimsIdentity
und dann die Schadensaktualisierung mit einer solchen durchführen.quelle
Ein weiterer (asynchroner) Ansatz, bei dem UserManager und SigninManager von Identity verwendet werden, um die Änderung im Identity-Cookie widerzuspiegeln (und optional Ansprüche aus der DB-Tabelle AspNetUserClaims zu entfernen):
quelle
SignInAsync()
nach dem Einrichten der Ansprüche zu tun .Mit der neuesten Asp.Net-Identität mit .net Core 2.1 kann ich Benutzeransprüche mit der folgenden Logik aktualisieren.
Registrieren Sie sich
UserClaimsPrincipalFactory
so, dass jedes Mal, wennSignInManager
der Benutzer singt, die Ansprüche erstellt werden.Implementieren Sie eine benutzerdefinierte
UserClaimsPrincipalFactory<TUser, TRole>
wie untenWenn Sie später in Ihrer Anwendung etwas in der Datenbank ändern und dies Ihrem authentifizierten und angemeldeten Benutzer mitteilen möchten, wird dies in den folgenden Zeilen erreicht:
Dadurch wird sichergestellt, dass der Benutzer aktuelle Informationen sehen kann, ohne sich erneut anmelden zu müssen. Ich habe dies kurz vor der Rückgabe des Ergebnisses in den Controller eingefügt, damit nach Abschluss des Vorgangs alles sicher aktualisiert wird.
Anstatt bestehende Ansprüche zu bearbeiten und Rennbedingungen für sichere Cookies usw. zu erstellen, melden Sie den Benutzer einfach stillschweigend an und aktualisieren den Status :)
quelle
Ich bekomme auch diese Ausnahme und habe die Dinge so geklärt
quelle
Einige Antworten von hier wurden mit meinen Ergänzungen in der wiederverwendbaren ClaimsManager- Klasse zusammengefasst.
Ansprüche wurden fortgeführt, Benutzer-Cookie aktualisiert, Anmeldung aktualisiert.
Bitte beachten Sie, dass ApplicationUser durch IdentityUser ersetzt werden kann, wenn Sie den vorherigen nicht angepasst haben. Auch in meinem Fall muss die Logik in der Entwicklungsumgebung etwas anders sein, sodass Sie möglicherweise die IWebHostEnvironment-Abhängigkeit entfernen möchten.
}}
quelle
wenn ich MVC5 benutze und den Anspruch hier hinzufüge.
Wenn ich das Anspruchsergebnis in der SignInAsync-Funktion überprüfe, kann ich den Rollenwert ohnehin nicht verwenden. Aber...
Nachdem diese Anforderung abgeschlossen wurde, kann ich in einer anderen Aktion (weitere Anforderung) auf Rolle zugreifen.
Ich denke also, dass die IEnumerable möglicherweise asynchron hinter dem Prozess aktualisiert wird.
quelle
Sie können Ansprüche für den aktuellen Benutzer aktualisieren, indem Sie eine
CookieAuthenticationEvents
Klasse implementieren und überschreibenValidatePrincipal
. Dort können Sie den alten Anspruch entfernen, den neuen hinzufügen und dann den Principal mit ersetzenCookieValidatePrincipalContext.ReplacePrincipal
. Dies hat keine Auswirkungen auf in der Datenbank gespeicherte Ansprüche. Dies verwendet ASP.NET Core Identity 2.2.Sie müssen die Ereignisklasse registrieren in
Startup.cs
:Sie können Dienste in die Ereignisklasse einfügen, um auf den neuen
AccountNo
Wert zuzugreifen. Gemäß der Warnung auf dieser Seite sollten Sie jedoch vermeiden, etwas zu teures zu tun:quelle
Um Anspruchsdetails aus der Datenbank zu entfernen, können wir den folgenden Code verwenden. Außerdem müssen wir uns erneut anmelden, um die Cookie-Werte zu aktualisieren
quelle
Mehrere Cookies, mehrere Ansprüche
quelle
quelle
Die Erweiterungsmethode hat bei mir hervorragend funktioniert, mit der Ausnahme, dass, wenn sich der Benutzer dort abmeldet, noch alte Anspruchssätze vorhanden sind. Mit einer winzigen Änderung wie beim Weiterleiten von usermanager funktioniert alles hervorragend und Sie müssen sich nicht abmelden und anmelden. Ich kann nicht direkt antworten, da mein Ruf beeinträchtigt wurde :(
quelle
Bitte schön:
von hier genommen.
quelle