Lassen Sie uns sagen, dass ich die folgenden Rollen haben:ASP.NET Core-Identität Identitätswechsel bestimmten Benutzer
Admin
Benutzer
Ich möchte Admin Rolle bestimmtes Benutzerkonto imitieren mit Benutzerrolle, aber ohne das Passwort des spezifischen Benutzerkontos zu kennen.
Admin sollte in der Lage sein, jeden Benutzer aus der Anwendung zu übernehmen und die Anwendung als Benutzer selbst durchsuchen zu können. I found a link wo dies tatsächlich in ASP.NET MVC 4.6 implementiert ist, aber ein wenig Kopfschmerzen beim Konvertieren dieser in Core-Version.
Vor allem, weil die letzten Zeile des Codes in dem Link
authenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = false }, impersonatedIdentity);
wo SignIn
Parameter in .NET-Core nicht IdentityResult
Klasse (impersonatedIdentity) erlaubt zu mehr übergeben werden. Es kann jetzt nur noch sein.
Also, was ich am Ende damit beschäftigt war,
public async Task<IActionResult> ImpersonateUserAsync(string userName)
{
var impersonatedUser = await _userManager.FindByNameAsync(userName);
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, impersonatedUser.FirstName, ClaimValueTypes.String),
new Claim(ClaimTypes.Surname, impersonatedUser.LastName, ClaimValueTypes.String),
new Claim(ClaimTypes.Email, impersonatedUser.Email, ClaimValueTypes.String)
};
var user = new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme));
var authenticationManager = _httpContextAccessor.HttpContext.Authentication;
await authenticationManager.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await authenticationManager.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties() { IsPersistent = false });
return RedirectToAction("Index", "Home");
}
I notwendig Ansprüche bevölkert und gab es ClaimsPrincipal
so kann SignInAsync
jetzt var user
nehmen. Dies scheint jedoch so zu sein, dass ich mich nicht wirklich anmelde, wie der Benutzer in der Tabelle AspNetUsers
gefunden hat, der die Rolle und die Berechtigungen hat, die zuvor von der Rolle "Admin" zugewiesen wurden. Um ehrlich zu sein, habe ich erwartet, dass sich der oben genannte Code zumindest als Name und Nachname unter var claims
anmeldet, aber tatsächlich bin ich immer noch als Administrator-Account angemeldet, nachdem ich zur Indexseite weitergeleitet wurde.
Was sind die richtigen Schritte, die ich ergreifen muss, um mich als das in der Tabelle definierte Benutzerkonto anzumelden, damit der Administrator die Anwendung als Benutzer selbst durchsuchen kann?
Seien Sie zuerst sehr vorsichtig bei der Implementierung dieser Art von Funktionalität, da es Sie für die gesetzliche Haftung öffnen kann, insbesondere wenn Sie mit Kreditkarteninformationen oder Gesundheitsinformationen umgehen. Zweitens müssen Sie einige Überprüfungsfunktionen bereitstellen, die angeben, dass ein Benutzer imitiert wurde, sodass nachgewiesen werden kann, dass es sich um den tatsächlichen Benutzer eines imitierten Benutzers handelt, der etwas ausgeführt hat. –
Vielen Dank für Ihren Rat, aber wir haben bereits eine Vereinbarung mit den Kunden getroffen, also mach dir keine Sorgen darüber. Irgendeine Idee/Ansatz, um das Problem hier zu lösen? – pavilion
Haben Sie die Lösung hier versucht: https://stackoverflow.com/a/42059249/61164 - Beachten Sie, dass dies SigninManager, nicht AuthenticationManager verwendet. –