2009-06-09 10 views
0

Die System.Security.Principal.WindowsIdentity.Impersonate-Funktion nimmt einen System.intptr-Parameter, der in meiner Situation (mit meinem begrenzten Verständnis) schrecklich nutzlos scheint.Ist es möglich, die Funktion "impersonate" mit einer Zeichenfolge (Benutzername) anstelle von intptr zu verwenden?

Ich entwickle eine Intranet-Anwendung, die integrierte Sicherheit verwendet, um Benutzer Seite für Seite gegen eine Rolle zu autorisieren, die mit ihrer Windows-Identität verknüpft ist. Ich habe keine Passwörter oder ähnliches. Einfach ein Windows-Benutzername. Wie könnte ich zu Testzwecken möglicherweise einen Windows-Benutzer basierend auf seinem Benutzernamen imitieren? Die "Impersonate" -Methode sprang bei mir als offensichtlich heraus, aber sie benötigt einen unerwarteten Parameter.

Vielen Dank im Voraus :)

Antwort

3

Auf den Punkt gebracht, nein. Aber du bist auf dem richtigen Weg. Sie müssen den Benutzer entweder dazu bringen, eine Anmeldung mit LoginUserA (C Win32 Api) zu simulieren oder Ihre IIS-Site auf Windows-Authentifizierung zu setzen.

In diesem Fall hat Ihre Seite eine Eigenschaft namens User vom Typ IPrincipal, die Sie dann als Benutzer verwenden können. Zum Beispiel (Entschuldigung, C# -Code).

IPrincipal p = this.User; 
WindowsIdentity id = (WindowsIdentity)p.Identity; 
WindowsImpersonationContext wic = id.Impersonate(); 
try { 
    // do stuff as that user 
} 
finally { 
    wic.Undo(); 
} 
0

Benutzer-Token (der Wert, der IntPtr in Impersonate darstellt) repräsentiert mehr als die Benutzername. Sie sind ein Handle in einen internen Windows-Kontext, der Informationen über den Benutzer, Authentifizierungstoken, aktuelle Sicherheitsrechte usw. enthält. Aus diesem Grund können Sie nicht ohne ein Kennwort imitieren. Sie müssen sich tatsächlich "einloggen", um ein Token über die LogonUser method zu erstellen.

Was ich in der Vergangenheit getan habe, ist ein spezielles "Test" Benutzerkonto mit einem Passwort, das ich einfach in Code oder einer Konfigurationsdatei speichern kann.

+0

Ich bin nicht sicher, dass diese Lösung unter den gegebenen Umständen möglich wäre. Da ich spät in den Entwicklungszyklus eintrat, war ich gezwungen, das System zu umgehen, um einen Wechsel der Tabellen und der Infrastruktur zu vermeiden. Ich verwende das WindowsIdentity.getCurrent() -Objekt und vergleiche diese Zeichenfolge mit einer "Username" -Spalte. Die Tabelle kann außer ihrem Benutzernamen keine Informationen über das Windows-Konto des Benutzers speichern. – Chris

0

Sie sollten nicht imitieren müssen, um die Rollenmitgliedschaft zu überprüfen. Verwenden Sie einfach die constructor für eine WindowsIdentity, die einen UPN (userPrincipalName) aus dem Benutzernamen gemäß Ihren UPN-Konventionen erstellt, dann erstellen Sie ein WindowsPrincipal von dieser Identität und IsInRole verwenden, um die Mitgliedschaft in einer Gruppe zu überprüfen. Dies funktioniert auf W2K3 und einer Windows 2003-Domäne, aber nicht in anderen Umständen.

var userIdentity = new WindowsIdentity(username + "@domain"); 
var principal = new WindowsPrincipal(userIdentity); 
var inRole = principal.IsInRole("roleName"); 

Sie können auch wollen entweder mit der Standard- oder eine benutzerdefinierte Rolle Anbieter zu berücksichtigen, die Ihnen erlaubt, die Rollen-Schnittstelle zu verwenden, die Mitgliedschaft zu überprüfen.

1

Sind Sie mit etwas windows-spezifische aus der Windows oder ist es nur eine praktische Möglichkeit, Auth/Auth zu erhalten, ohne dass Benutzer verwalten zu müssen? Wenn Sie Windows-basiert sein müssen, hat Serapth die richtige Methode. Wenn Sie es nur als praktischen Auth/Auth-Speicher verwenden, sollten Sie Ihren Code wahrscheinlich schreiben, um mit IPrincipal zu kommunizieren. Sie können dann Ihre eigenen Implementierungen von IPrincipal mit den gewünschten Werten entweder in den HttpContext.User oder Thread.CurrentThread.Principal injizieren, abhängig von der Art Ihrer Tests und Ihrer App.

Verwandte Themen