7 Stimmen

Authentifizierte HttpWebRequest mit Umleitung, persistierende Anmeldeinformationen?

Meine ASP.NET 2.0-Anwendung erstellt eine HTTPWebRequest zu einer Website im Intranet eines Unternehmens, die NTLM-Authentifizierung verwendet. Die übergebenen Anmeldeinformationen sind für ein Dienstkonto, das erfolgreich an der Domäne authentifiziert wird (das Sicherheitsprotokoll bestätigt dies)

Es folgt ein abgekürzter Code.

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username,
                pwd, domain); 
req.Credentials = cred;

HttpWebResponse response = req.GetResponse() as HttpWebResponse;

Im Rahmen der Anfrage gibt es mehrere Umleitungen (innerhalb derselben Domäne) zur endgültigen Antwort, die auf meinem Entwicklungsrechner (Windows 2k) problemlos verarbeitet wird

Wenn diese Anforderung von meiner Bereitstellungsumgebung (Windows 2k3) erstellt wird, erhalte ich einen Fehler 401 Unauthorized von der Website zurückgegeben, scheinbar nach dem ersten Umleitungscode zurückgegeben wird (301 Moved), und meine Anforderung Objekt versucht, die Umleitung zu folgen.

Also im Grunde, weiß jemand von irgendwelchen Problemen rund um authentifizierte HttpWebRequests, die Umleitungen folgen?

PS - Die offensichtliche Lösung besteht darin, einfach die Seite anzufordern, auf die umgeleitet wird - aber ich, der für die Intranet-Site zuständige Administrator, möchte die Nutzung meiner Anwendung überwachen, indem ich auf eine bestimmte Seite umgeleitet werde.

0 Stimmen

Haben Sie Ihren Netzwerkverkehr beobachtet (z. B. mit Fiddler), um festzustellen, ob der Client einen Authentifizierungsversuch beim endgültigen Ziel der Umleitung unternimmt? Das Versäumnis, sich automatisch beim umgeleiteten Server zu authentifizieren, kann eine Sicherheitsmaßnahme innerhalb von .NET sein, um ein versehentliches Durchsickern von Anmeldeinformationen zu verhindern.

0 Stimmen

Ich stehe vor dem gleichen Problem und bin immer noch nicht in der Lage, das Problem zu lösen. stackoverflow.com/questions/3562979/

12voto

Jared Kells Punkte 6287

Para HttpWebRequest um Anmeldeinformationen über Umleitungen hinweg wiederzuverwenden, müssen Sie einen Anmeldeinformations-Cache verwenden. Wenn Sie nur eine NetworkCredentials Objekts wird es nur bei der ersten Anfrage verwendet.

Hier ist ein Beispiel:

HttpWebRequest req = WebRequest.Create(queryUrl) as HttpWebRequest;
NetworkCredential cred = new NetworkCredential(username, pwd, domain); 
var cache = new CredentialCache {{queryUrl, "Ntlm", cred}};
req.Credentials = cache;
HttpWebResponse response = req.GetResponse() as HttpWebResponse;

1voto

Rob Punkte 2938

Das hängt davon ab, wie Ihr Berechtigungsschema funktioniert. Die Netzwerkanmeldeinformationen helfen nur für den NTLM-Teil von if. Ich vermute, dass die Website, auf die Sie zugreifen wollen, auch die Formularauthentifizierung verwendet. Wenn dies der Fall ist, sollten Sie bei der Anmeldung ein Authentifizierungs-Cookie erhalten, das Sie in nachfolgende Anfragen einfügen müssen, z. B. nach einer Weiterleitung. Ich glaube, das WebRequest-Objekt hat eine Header-Sammlung, die Sie verwenden können, um das Cookie zu speichern. Es könnte eine gute Idee sein, Fiddler oder Firebug zu verwenden, um zu sehen, was beim normalen Surfen übertragen wird.

-1voto

Tion Punkte 1450

Wenn Sie NTLM verwenden, handelt es sich um das klassische 2-Hop-Problem. Es funktioniert auf Ihrem Entwicklungsrechner, weil der Client und der Server sich auf demselben Rechner befinden und die Anmeldeinformationen höchstens einmal weitergegeben werden (an den Zielrechner der Umleitung, nehme ich an).

Bei der Bereitstellung in Ihrer Prod-Umgebung sind 3 Rechner beteiligt. Der Client-Browser gibt die Anmeldeinformationen an Server1 weiter, woraufhin Server1 versucht, die Anmeldeinformationen an Server2 weiterzugeben, was nicht zulässig ist. Eine Lösung besteht darin, die Kerberos-Authentifizierung (ein strengeres Protokoll) zu implementieren, die es Server1 ermöglicht, Anmeldeinformationen an Server2 weiterzugeben

0 Stimmen

Danke Tion, aber ich glaube nicht, dass dies das Problem in diesem Fall ist - das Credentials-Objekt ist für ein separates Konto zu dem Benutzer, der in meiner App angemeldet ist, so gibt es nur einen Sprung beteiligt - ich sollte das wirklich erwähnt haben :) Es ist die Tatsache, dass es eine transparente Umleitung beteiligt, um die Antwort vom Server, die scheinbar das Problem ist, wenn ich die endgültige URL anstelle der, die umleitet angeben, es funktioniert alles...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X