Benutzerimitation
Manche Fehler existieren nur bei einer Person. Ein Datensatz, der nicht geöffnet wird, ein Menüpunkt, der nicht vorhanden ist, ein Gesamteintrag, der falsch aussieht – all das hängt von den Webrollen, Tabellenberechtigungen und Dataverse-Sicherheitsrollen ab, die diesem Kontakt zugeordnet sind. Die Benutzerimitation ermöglicht es einem internen Administrator, sich als Kontakt einzuloggen, genau zu sehen, was er sieht, und dann wieder herauszutreten.
Wenn es hilft
Imitation beantwortet Fragen, die eine Beschreibung des Problems nicht beantworten kann.
- Wiedergabe eines Support-Problems. Anstatt darüber nachzudenken, welche Berechtigung fehlt, schaust du die Seite so an, wie es die Person tut, die sie meldet.
- Überprüfung einer Berechtigungsänderung. Nachdem Sie eine Webrolle oder eine Tabellenberechtigung bearbeitet haben, bestätigen Sie die Wirkung auf einen echten Kontakt, anstatt sie abzuleiten.
- Überprüfen, was eine Rolle tatsächlich offenlegt. Nützlich vor dem Go-Live, wenn die Lücke zwischen beabsichtigtem und tatsächlichem Zugriff am leichtesten falsch zu verstehen ist.
Sie nutzen
Die Affordance befindet sich im Profilmenü und erscheint nur für Nutzer, die sie nutzen dürfen.
- Melden Sie sich als interner Benutzer in der Administratorrolle an, öffnen Sie dann das Profilmenü und wählen Sie 'Als anderer Benutzer anzeigen'.
- Geben Sie mindestens drei Zeichen ein, um nach Namen oder E-Mail-Adresse zu suchen, oder fügen Sie eine Benutzer-ID ein, um eine exakte Übereinstimmung zu erhalten.
- Wähle die Person aus und bestätige sie. Das Portal lädt als sie neu – gleiche Webrollen, gleiche Tabellenberechtigungen, gleiche Zeilen.
- Ein Banner bleibt so lange wie möglich oben auf jeder Seite befestigt. Wählen Sie Stopp, um zu Ihrer eigenen Sitzung zurückzukehren.
Wer kann sich ausgeben
Für jeden Aufruf werden zwei Bedingungen auf dem Server überprüft, unabhängig davon, was die Schnittstelle anbot:
- Der angemeldete Benutzer übernimmt die
SystemAdminRolle. Ihr Projekt entscheidet, welche Dataverse-Sicherheitsrolle ihr gewährt wird – die generierten Vorlagen ordnen die integrierte Systemadministratorrolle plus eine konfigurierbare über zu.PortalIdentityOptions.SystemAdminRoleName - Der angemeldete Nutzer ist ein echter interner Dataverse-Nutzer. Dies wird separat von der Rolle überprüft, sodass ein Portal-Kontakt sich nie ausgeben kann, selbst wenn Ihr Projekt ihm die Rolle versehentlich gewährt.
Das Ziel ist immer ein Portalkontakt, der allein über die Kontakttabelle gelöst wird. Die Bereitstellung einer internen Benutzer-ID löst sich einfach nicht auf – es gibt keinen Weg von hier zu einem zweiten Mitarbeiterkonto.
Imitation reduziert nur den Zugang
Ein interner Benutzer wird zum Kontakt, nie umgekehrt und nie zu einem weiteren internen Benutzer. Diese Richtung sorgt dafür, dass die Funktion sicher ausgeliefert werden kann: Die nachgeahmte Sitzung kann nur weniger leisten als der Administrator, daher gibt es keine Privilegien durch die Nutzung der Funktion.
Einschränkung, wer nachgeahmt werden darf
Standardmäßig ist jeder aktive Kontakt ein Kandidat. Implementieren IImpersonationTargetFilter Sie diese Einschränkung – indem Sie Kontakte ausschließen, die mit Mitarbeiterkonten, Datensätzen außerhalb der Geschäftseinheit des Administrators oder allem, was Ihre Organisation als tabu behandelt.
public sealed class StaffContactsAreOffLimits : IImpersonationTargetFilter
{
public async Task<bool> CanImpersonateAsync(
ClaimsPrincipal impersonator, Guid targetContactId, CancellationToken ct)
{
// Return false to hide the contact from search AND refuse impersonation.
return await this.IsOrdinaryPortalContactAsync(targetContactId, ct);
}
}
// Program.cs
builder.Services.AddScoped<IImpersonationTargetFilter, StaffContactsAreOffLimits>();
Der Filter steuert sowohl die Suche als auch die Imitation. Ein von Ihnen abgelehnter Kontakt ist im Picker unsichtbar und nicht nur unauswählbar – sonst würde die Suche still und leise zu einer Möglichkeit werden, Personen aufzuzählen, die ein Administrator niemals werden kann.
Die Prüfungsspur
Jeder Start, jeder Stopp und jeder abgelehnte Versuch wird aufgezeichnet. Ablehnungen werden absichtlich aufgezeichnet: Eine Erfolgsspur allein kann nicht beantworten, ob jemand es versucht hat.
Dataverse kann nicht aufzeichnen, wer hinter der Sitzung steckte
Das Portal verbindet sich mit Dataverse als einzelner Anwendungsnutzer und drückt die angemeldete Sitzung durch die Imitation des Ziels aus. Der Administrator wird nie übertragen, sodass im Dataverse-Auditlog "ein Administrator, der als Kontakt fungiert" und "der Kontakt sich normal anmeldet" nicht unterscheidbar sind – und alles, was während der Impersonation geschrieben wird, wird dem Kontakt in
createdbyundmodifiedbyzugeordnet. Der portalseitige Pfad ist der einzige Ort, an dem diese Informationen existieren, weshalb sie nicht optional sind.
Aus der Box wird jedes Ereignis ins Anwendungsprotokoll geschrieben. Implementieren Sie IImpersonationAuditSink es so, dass es überall dort gespeichert wird, wo Ihre Organisation ihre Audit-Aufzeichnungen speichert – Sinks werden neben dem integrierten hinzugefügt, anstatt ihn zu ersetzen.
public sealed class ImpersonationAuditTable : IImpersonationAuditSink
{
public Task OnStartedAsync(ImpersonationAuditEvent e, CancellationToken ct) => this.WriteAsync("started", e, ct);
public Task OnStoppedAsync(ImpersonationAuditEvent e, CancellationToken ct) => this.WriteAsync("stopped", e, ct);
// Denied attempts matter as much as successful ones — a trail of
// successes alone can't answer "did anyone try?".
public Task OnDeniedAsync(ImpersonationAuditEvent e, string reason, CancellationToken ct) => this.WriteAsync(reason, e, ct);
}
// Program.cs — added, not replaced: the framework's own logging sink stays.
builder.Services.AddTransient<IImpersonationAuditSink, ImpersonationAuditTable>();
Von React
Das gleiche Erlebnis wird für React ausgeliefert: ein Profilmenü-Eintrag, der Picker und das Banner. Die zugrundeliegenden Aktionen sind aktiviert useAuth() , wenn du lieber deine eigene Benutzeroberfläche darum herum aufbauen möchtest.
const auth = useAuth();
// Search, then start. Both are refused server-side unless the caller
// is an internal user holding the SystemAdmin role.
const { results } = await auth.searchImpersonationTargets('smith');
await auth.impersonate(results[0].contactId);
// While impersonating, `auth.user` describes the CONTACT.
auth.user.isImpersonating; // true
auth.user.impersonatorName; // the administrator behind the session
await auth.stopImpersonation();
Es lohnt sich zu wissen
- Wenn der nachgeahmte Kontakt sein Passwort mitten in der Sitzung ändert, endet die Sitzung und du wirst wieder in den ausgeloggten Zustand zurückgesetzt, statt auf dein eigenes Konto. Eine erneute Anmeldung stellt das Passwort wieder her.
- Imitation kann nicht verschachtelt werden. Stoppe die aktuelle Sitzung, bevor du eine neue startest.
- Sie überdauert die Browsersitzung nicht – das Schließen des Browsers beendet sie.
