2008-10-01 4 views
1

Ich habe eine ASPX-Seite (auf Server A), die mit NTLM-Anmeldeinformationen aufgerufen wird. Ein Teil des Jobs dieser Seite besteht darin, eine HTML-Seite (auf Server B) aufzurufen und sie an den Client zurückzugeben. (Die Firewall ermöglicht den Zugriff auf A, aber nicht auf B. Der Benutzer erhält normalerweise Zugriff auf beide Server.). Server B ist auch nicht für anonymen Zugriff geöffnet, daher muss ich Anmeldeinformationen angeben.Abrufen der NTLM-Anmeldeinformationen von der Antwort auf einer APSX-Seite

Wenn ich einige Anmeldeinformationen (wie im angehängten Code) fest codieren, funktioniert es, aber im Idealfall würde ich die Anmeldeinformationen, die von der ASPX-Seite empfangen wurden. Gibt es eine Möglichkeit, diese NetworkCredentials zu erhalten, damit ich sie weitergeben kann?

protected void Page_Load(object sender, EventArgs e) { 
    Response.Clear(); 
    WebClient proxyFile = new WebClient(); 
    CredentialCache cc = new CredentialCache(); 
    cc.Add(new Uri("http://serverB/"), "NTLM", 
     new NetworkCredential("userName", "password", "domain")); 
    proxyFile.Credentials = cc; 

    Stream proxyStream = proxyFile.OpenRead("http://serverB/Content/webPage.html"); 
    int i; 
    do { 
     i = proxyStream.ReadByte(); 
     if (i != -1) { 
      Response.OutputStream.WriteByte((byte)i); 
     } 
    } while (i != -1); 
    Response.End(); 
} 

Antwort

1

Sie können sicherlich den Login-Namen des Anrufers erhalten, aber das Passwort nicht. NTLM verwendet einen Abfrage-/Antwortmechanismus, sodass das Kennwort niemals übertragen wird. Ihr Server muss Zugriff auf ein Kennwort-Äquivalent (ein Hash) haben, um die Herausforderung zu bilden und die Antwort zu überprüfen, aber selbst wenn Sie es erhalten können, wird Ihnen das Passwort-Äquivalent bei der Erstellung von Anmeldeinformationen keinen Nutzen bringen wird von Server B akzeptiert.

Wenn Sie Identitätswechsel einrichten können, wie in einer anderen Antwort beschrieben, erhalten Sie nicht unbedingt das, was Sie wollen. Standardmäßig darf ein Identitätswechsel-Serverprozess seine Identität nicht an einen anderen Server übertragen. Dieser zweite Hop wird als Delegierung bezeichnet und muss explizit auf den beteiligten Servern (und/oder in Active Directory) konfiguriert werden.

Abgesehen von der Delegierung denke ich, Ihre einzige Option besteht darin, eine Datenbank mit Anmeldeinformationen zu pflegen, auf die Server A zugreifen und auf Server B zugreifen kann. Der sichere Aufbau ist ein subtiler und zeitaufwändiger Prozess. Auf der anderen Seite gibt es einen Grund, warum die Delegierung standardmäßig deaktiviert ist. Wenn ich mich bei einem Server anmelde, soll ich meine Identität für den Zugriff auf andere Server verwenden dürfen? Delegation ist die einfachste Option für Sie, aber Sie müssen sicherstellen, dass Server A nicht kompromittiert werden kann, um unverantwortliche Dinge mit den Identitäten Ihrer Benutzer zu tun.

0

Page.User erhalten Sie die Sicherheitsprinzipal des Benutzers, unter dem die Seite ausgeführt wird.

Von dort sollten Sie in der Lage sein, es herauszufinden.

0

Können Sie in Ihrem Szenario die Identität des Anrufers annehmen? auf diese Weise Sie würde sogar entlang Beglaubigungsschreiben übergeben müssen, zB:

<authentication mode="Windows" /> 
<identity impersonate="true" /> 

in web.config von Server A. Aber das hängt natürlich von Ihrer Situation, da Sie nicht, dass für Server A. möchten Aber wenn Sie Kann dies Ihr Problem ohne benutzerdefinierten Code lösen?

Heres ein Link für den Identitätswechsel der Einrichtung: http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller

Verwandte Themen