Discussion:
Impersonate immer noch nicht verstanden :(
(zu alt für eine Antwort)
Johannes Eble
2005-03-25 15:23:38 UTC
Permalink
Hallo,

ich habe gedacht, dass ich Impersonation verstanden haette, aber
denkste!

Ich habe das Impersonation Beispiel im ASP.NET Codebuch
nachgeschrieben (bei mir in C#).

Einstellungen im IIS fuer die Webapplikation:
Nur Integrierte Windows-Authentifizierung
Eintrag in der web.config ebenfalls:
<authentication mode="windows" />

Auf meinem lokalen Notebook probiere ich das und habe zwei Benutzer
mit Adminrechten (Johannes und Pia).
Wenn ich nun in der web.config

<identity impersonate="true" />
setze und das Impersonation-Beispiel starte, kommt auch richtig im
Internet Explorer:

"Ihr Benutzername lautet: LAPTOP\Johannes"


Wenn ich allerdings
<identity impersonate="false" /> setze, kommt das auch. Ohne
Impersonation nimmt doch der ASPNET-Prozess den User SYSTEM an. Sollte
da nicht der SYSTEM kommen? Warum ist das impersonate hier total
wirkungslos?

Desweiteren habe ich folgendes probiert:
<identity impersonate="true" userName="Johannes" password="..." />

Hier kommt eine Parserfehlermeldung:
"Der Windows-Benutzertoken konnte nicht aus den in der
Konfigurationsdatei angegebenen Anmeldeinformationen erstellt werden.
Betriebssystemfehler 'Unbekannter Fehler'"

Ich will halt sehen, ob und wie die Impersonation klappt. Was mache
ich falsch?


Gruesse

Johannes
Olaf Lüder [MVP]
2005-03-25 16:42:02 UTC
Permalink
Hallo Johannes,
Post by Johannes Eble
Ich habe das Impersonation Beispiel im ASP.NET Codebuch
nachgeschrieben (bei mir in C#).
[...]
Wenn ich nun in der web.config
<identity impersonate="true" />
setze und das Impersonation-Beispiel starte, kommt auch richtig im
"Ihr Benutzername lautet: LAPTOP\Johannes"
da wäre es jetzt natürlich nicht schlecht, zu wissen, welcher Code diese
Ausgabe erzeugt. Hat ja nicht jeder das Buch zur Hand... ;-)
Post by Johannes Eble
Wenn ich allerdings
<identity impersonate="false" /> setze, kommt das auch. Ohne
Impersonation nimmt doch der ASPNET-Prozess den User SYSTEM an.
Naja, der Prozeß läuft immer unter einem fixen Benutzer; dies ist
typischerweise ASPNET, System oder Netzwerkdienst (beim IIS 6).

Ohne Impersonation laufen auch die Threads in dem entsprechenden Kontext.
Post by Johannes Eble
Sollte
da nicht der SYSTEM kommen?
Das kommt darauf an, wie Du das ganze abfragst.

System.Security.Principal.WindowsIdentity.GetCurrent().Name

sollte Dir das gewünschte liefern.

Wenn Du einfach nur den *authentifizierten* Benutzer abfragst, z.B. über

Context.User.Identity.Name

erhältst Du natürlich in beiden Fällen den angemeldeten Benutzer.
Die Anmeldung erfolgt ja in jedem Fall (da Du den anonymen Zugriff
deaktiviert hast), mit einer (nicht) durchgeführten Impersonation hat das
nichts zu tun.

Das gleiche Ergebnis erhältst Du übrigens auch über

System.Threading.Thread.CurrentPrincipal.Identity.Name
Post by Johannes Eble
Warum ist das impersonate hier total
wirkungslos?
Glaube ich nicht; der Fehler dürfte eher in Deiner Abfrage liegen (s.o.) ;-)
Post by Johannes Eble
<identity impersonate="true" userName="Johannes" password="..." />
"Der Windows-Benutzertoken konnte nicht aus den in der
Konfigurationsdatei angegebenen Anmeldeinformationen erstellt werden.
Betriebssystemfehler 'Unbekannter Fehler'"
Wenn die Benutzerdaten korrekt sind und

http://support.microsoft.com/kb/810204



nicht zutrifft, sollte das eigentlich klappen.
--
Gruß, Olaf
MS MVP ASP / ASP.NET
Johannes Eble
2005-03-26 15:59:07 UTC
Permalink
Hallo Olaf,


On Fri, 25 Mar 2005 17:42:02 +0100, Olaf Lüder [MVP]
Post by Olaf Lüder [MVP]
Hallo Johannes,
Post by Johannes Eble
Ich habe das Impersonation Beispiel im ASP.NET Codebuch
nachgeschrieben (bei mir in C#).
[...]
Wenn ich nun in der web.config
<identity impersonate="true" />
setze und das Impersonation-Beispiel starte, kommt auch richtig im
"Ihr Benutzername lautet: LAPTOP\Johannes"
da wäre es jetzt natürlich nicht schlecht, zu wissen, welcher Code diese
Ausgabe erzeugt. Hat ja nicht jeder das Buch zur Hand... ;-)
Ach ja, natuerlich:

aspx-Seite:

...
<form id="Form1" method="post" runat="server">
<h3>Impersonation</h3>
<p>
Sie sind nun am System angemeldet. Diese
Webseite wird im Kontext
des aktuellen Benutzers ausgeführt.
</p>
<p>
Ihr Benutzername lautet: <%# GetLoginName() %>
</p>
<p>
Sie haben derzeit folgende
Gruppen-Mitgliedschaften:
<ul>
<%# GetRoles() %>
</ul>
</p>
</form>
...

cs-Seite:
...

public class WebForm1 : System.Web.UI.Page
{
private System.Security.Principal.WindowsPrincipal
principal;

public string GetLoginName()
{
return principal.Identity.Name;
}

public string GetRoles()
{
string result = "";
System.Security.Principal.WindowsIdentity
identity = (WindowsIdentity) principal.Identity;
System.Type type =
System.Type.GetType("System.Security.Principal.WindowsIdentity");
object[] roles = (object[])
type.InvokeMember("_GetRoles",
BindingFlags.Static |
BindingFlags.InvokeMethod |
BindingFlags.NonPublic, null,
identity,
new object[] { identity.Token },
null);

foreach (string role in roles)
{
if(role!=null)
{
if(role.Length>0)
{
result += "<li>" +
role;
}
}
}

return result;

}


private void Page_Load(object sender, System.EventArgs
e)
{
// Hier Benutzercode zur Seiteninitialisierung
einfügen
principal = (WindowsPrincipal) Context.User;

DataBind();
}

#region Vom Web Form-Designer generierter Code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: Dieser Aufruf ist für den ASP.NET
Web Form-Designer erforderlich.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Erforderliche Methode für die
Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem
Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
this.Load += new
System.EventHandler(this.Page_Load);
}
#endregion
}
...
Post by Olaf Lüder [MVP]
Post by Johannes Eble
Wenn ich allerdings
<identity impersonate="false" /> setze, kommt das auch. Ohne
Impersonation nimmt doch der ASPNET-Prozess den User SYSTEM an.
Naja, der Prozeß läuft immer unter einem fixen Benutzer; dies ist
typischerweise ASPNET, System oder Netzwerkdienst (beim IIS 6).
Hmm. Ich verwende WinXP Pro SP1, sieht so aus, dass ich IIS 5.1 habe.
Post by Olaf Lüder [MVP]
Ohne Impersonation laufen auch die Threads in dem entsprechenden Kontext.
Und mit Impersonation laufen die Threads im Kontext des Logon-Users
und der Prozess immer noch unter ASPNET?
Post by Olaf Lüder [MVP]
Post by Johannes Eble
Sollte
da nicht der SYSTEM kommen?
Das kommt darauf an, wie Du das ganze abfragst.
System.Security.Principal.WindowsIdentity.GetCurrent().Name
sollte Dir das gewünschte liefern.
Ok, damit scheint es zu funktionieren. Es kommt dann tatsaechlich
ASPNET, wenn impersonation auf false ist.
Post by Olaf Lüder [MVP]
Wenn Du einfach nur den *authentifizierten* Benutzer abfragst, z.B. über
Context.User.Identity.Name
erhältst Du natürlich in beiden Fällen den angemeldeten Benutzer.
Die Anmeldung erfolgt ja in jedem Fall (da Du den anonymen Zugriff
deaktiviert hast), mit einer (nicht) durchgeführten Impersonation hat das
nichts zu tun.
Aha. Wenn ich jetzt mit den gleichen Einstellungen am Betriebssystem
und am IIS fuer das Verzeichnis der Webapplikation (also, nur
Integriert Windows) und das SQL-Server-Authentifizierung ebenfalls auf
Nur-Windows einstelle: Brauche ich dann keine Impersonation, oder?

D.h. dem SQL-Server ist es egal, unter welchem Kontext der
Prozess/Thread der Webapplikation ist, er schaut nur auf den
authentifizierten Benutzer (bzw. er ueberlaesst das ganz dem Windows).

Impersonation braucht man nur, wenn man aus irgend einem Grund
(welchen?) braucht, dass der Thread selbst im Kontext eines bestimmten
Benutzers ist.

Habe ich das soweit richtig verstanden?

...
Post by Olaf Lüder [MVP]
Post by Johannes Eble
<identity impersonate="true" userName="Johannes" password="..." />
"Der Windows-Benutzertoken konnte nicht aus den in der
Konfigurationsdatei angegebenen Anmeldeinformationen erstellt werden.
Betriebssystemfehler 'Unbekannter Fehler'"
Wenn die Benutzerdaten korrekt sind und
Hmm. Koennte es daran liegen, dass meine Konten auf dem Laptop keine
Passwoerter erfordern (WinXP-Voreinstellung)?
Post by Olaf Lüder [MVP]
http://support.microsoft.com/kb/810204
Da ich WinXP benutze, trifft dies nicht zu.


Gruesse

Johannes
Olaf Lüder [MVP]
2005-03-26 16:54:56 UTC
Permalink
Hallo Johannes,
Post by Johannes Eble
Und mit Impersonation laufen die Threads im Kontext des Logon-Users
und der Prozess immer noch unter ASPNET?
Ja. Genaugenommen läuft der Thread nicht wirklich in diesem Kontext, sondern
nur WindowsIdentity entspricht dem angemeldeten Benutzer. Deshalb liefert
Dir auch

System.Threading.Thread.CurrentPrincipal.Identity.Name

das erwähnte Ergebnis.
Post by Johannes Eble
Aha. Wenn ich jetzt mit den gleichen Einstellungen am Betriebssystem
und am IIS fuer das Verzeichnis der Webapplikation (also, nur
Integriert Windows) und das SQL-Server-Authentifizierung ebenfalls auf
Nur-Windows einstelle: Brauche ich dann keine Impersonation, oder?
Doch (aber wenn Du so weiter machst, verwirrst Du mich wirklich langsam ;-)
Post by Johannes Eble
D.h. dem SQL-Server ist es egal, unter welchem Kontext der
Prozess/Thread der Webapplikation ist, er schaut nur auf den
authentifizierten Benutzer (bzw. er ueberlaesst das ganz dem Windows).
Nein; AFAIK wird die WindowsIdentity (s.o.) herangezogen; insofern wird hier
schon der entsprechende Identitätswechsel benötigt.
Post by Johannes Eble
Impersonation braucht man nur, wenn man aus irgend einem Grund
(welchen?) braucht, dass der Thread selbst im Kontext eines bestimmten
Benutzers ist.
Du benötigst es für die schon erwähnten DB-Zugriffe, für Dateizugriffe etc.;
für alles, was Rechte des jeweiligen Nutzers erfordert.
Post by Johannes Eble
Hmm. Koennte es daran liegen, dass meine Konten auf dem Laptop keine
Passwoerter erfordern (WinXP-Voreinstellung)?
Da bin ich im Moment leider etwas überfragt...
--
Gruß, Olaf
MS MVP ASP / ASP.NET
Johannes Eble
2005-03-30 08:20:23 UTC
Permalink
Hallo Olaf,

zunaechst vielen Dank, du hast mir schon sehr viel weiter geholfen.

On Sat, 26 Mar 2005 17:54:56 +0100, Olaf Lüder [MVP]
Post by Olaf Lüder [MVP]
Hallo Johannes,
Post by Johannes Eble
Und mit Impersonation laufen die Threads im Kontext des Logon-Users
und der Prozess immer noch unter ASPNET?
Ja. Genaugenommen läuft der Thread nicht wirklich in diesem Kontext, sondern
nur WindowsIdentity entspricht dem angemeldeten Benutzer. Deshalb liefert
Dir auch
System.Threading.Thread.CurrentPrincipal.Identity.Name
das erwähnte Ergebnis.
Ich weiss nicht, wie sich die Idee bei mir festgesetzt hat, der Thread
wuerde die Impersonation Identitaet annehmen, aber ich denke, dass
hier einige Buecher, die ich gelesen habe, zu ungenau sind.

...

[SQL-Server]
Post by Olaf Lüder [MVP]
Nein; AFAIK wird die WindowsIdentity (s.o.) herangezogen; insofern wird hier
schon der entsprechende Identitätswechsel benötigt.
Ok. Verwirren kann ich doch einen alten Hasen wie dich nicht, oder? ;)

Aber auf den SQL-Server will ich letztlich hinaus. Und da habe ich das
Gefuehl, alle Buecher haben bei diesem Thema von Microsoft
abgeschrieben und handeln die Windows-/SQL-Server-Sicherheit aenlich
langweilig und trocken wie ein Nachschlagewerk ab, beschreiben *alle*
Moeglichkeiten, statt nur die Gaengigen.
Wenn ich da richtig durchblicken wuerde, ich koennte es besser ;)
Ich wuerde mit der am weitesten verbreiteten (z.B. Integriert
Windows/Impersonation) anfangen und dazu ein *Beispiel* bringen. Dann
vielleicht noch eine andere Moeglichkeit und wieder ein Beispiel. Und
auch die Motivation, wann jetzt diese Variante besser ist.


Gruss


Johannes

Loading...