0

Lassen Sie uns sagen, dass ich die folgenden Rollen haben:ASP.NET Core-Identität Identitätswechsel bestimmten Benutzer

  1. Admin

  2. 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?

+0

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. –

+0

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

+1

Haben Sie die Lösung hier versucht: https://stackoverflow.com/a/42059249/61164 - Beachten Sie, dass dies SigninManager, nicht AuthenticationManager verwendet. –

Antwort

0

Es gibt einen Blog-Post über Identitätswechsel in Asp.Net Core HERE. Ich suche nur nach einer solchen Lösung, also habe ich es noch nicht versucht. Es scheint jedoch, dass Sie auf dem richtigen Weg sind. Es gibt nur geringfügige Unterschiede zwischen Ihrem Code und Max.

Grundsätzlich müssen Sie das Cookie auf der Seite des Browsers ersetzen. Also "denkt" der Server für die nächste Anfrage, dass jemand anders eingeloggt ist. Zumindest habe ich das bisher verstanden. Deshalb sollten Sie die ursprüngliche Identität auch im Cookie speichern, damit Sie bei Bedarf zum ursprünglichen Benutzer zurückkehren können.

Ich komme zurück, wenn ich sowieso eine funktionierende Lösung habe.

Verwandte Themen