
Das Web ist heutzutage der bevorzugte Bereitstellungsmechanismus für die meisten Anwendungen. Es gibt jedoch Szenarien, in denen Sie möglicherweise eine CLI- oder Desktop-Anwendung für Ihre Kunden erstellen möchten. Sobald Sie jedoch die gemütlichen Grenzen des Browsers verlassen, muss Ihre Anwendung mit einer ganzen Reihe von Proxy-Konfigurationen umgehen, wenn sie in einem typischen Unternehmensnetzwerk ausgeführt werden soll.
Für die Zwecke dieses Beitrags bedeutet „typisches Unternehmensnetzwerk“, dass Ihre Benutzer eine Windows-Version verwenden und hinter einem authentifizierenden HTTP-Proxy sitzen. Obwohl dies eine recht gängige Konfiguration zu sein scheint, funktionieren überraschend viele Anwendungen in dieser Umgebung einfach nicht.
Glücklicherweise sind die Standardeinstellungen beim Schreiben einer .NET-Anwendung größtenteils kostenlos. Der Standard-Webproxy verwendet automatisch die Proxy-Einstellungen, die der Benutzer im Internet Explorer konfiguriert hat. Wenn möglich, sollten Sie sich darauf verlassen. Es ist verlockend, Proxy-Hostnamen und Port-Konfigurationswerte offenzulegen, die der Benutzer an die Anwendung weitergeben kann. In manchen Fällen verfügt ein Unternehmensbenutzer jedoch möglicherweise nicht über einen einzigen bekannten Proxy. WPAD- und PAC-Dateien ermöglichen die dynamische Konfiguration von Proxys. Siehe Dieser Beitrag für weitere blutige Details.
Leider übernehmen die Standardeinstellungen die Authentifizierung nicht automatisch. Webanfragen schlagen typischerweise mit dem Fehler 407 ProxyAuthenticationRequired fehl. Im nächsten Schritt prüfen Sie den zurückgegebenen Proxy-Authenticate-Antwortheader, um festzustellen, welche Authentifizierungsart der Proxy akzeptiert. In der Regel handelt es sich dabei um eine Kombination aus Basic, Digest, NTLM oder Negotiate. Unterstützt der Proxy NTLM oder Negotiate, können Sie den angemeldeten Benutzer, der Ihre Anwendung ausführt, automatisch authentifizieren, indem Sie einfach das Attribut useDefaultCredentials=true wie beschrieben zu Ihrer app.config hinzufügen. werden auf dieser Seite erläutert:
Dies ist besonders praktisch, da wir weder unseren Anwendungscode ändern noch uns mit der Verwaltung der Anmeldeinformationen herumschlagen müssen. Leider funktioniert dies nicht, wenn der Proxy für die Verwendung der Basic- oder Digest-Authentifizierung konfiguriert ist. Obwohl dies eine ungewöhnliche Konfiguration ist, wird man sie in der Praxis immer wieder antreffen. In diesem Fall benötigen Sie eine Möglichkeit, einen Benutzernamen und ein Passwort einzulesen und diese dann in der Eigenschaft IWebProxy.Credentials zu speichern. Wie bereits erwähnt werden auf dieser Seite erläutert, diese Konfiguration wird normalerweise nicht verwendet, da sie die Last auf jede Anwendung überträgt, Proxy-Anmeldeinformationen zu verwalten.
In C# werden die in der Datei app.config konfigurierten Standard-Proxy-Einstellungen in der statischen Variable WebRequest.DefaultWebProxy widergespiegelt. Anstatt die Anmeldeinformationen direkt zu ändern, ist es einfacher, einen Dekorator für den Proxy zu erstellen, der die Leseanforderungen weiterleitet, aber seine eigenen Anmeldeinformationen verwaltet, ohne den zugrunde liegenden Proxy zu berühren:
öffentliche Klasse ProxyWrapper: IWebProxy {privater schreibgeschützter IWebProxy _proxy; öffentlicher ProxyWrapper (IWebProxy-Proxy) {_proxy = Proxy;} öffentliche ICredentials-Anmeldeinformationen {abrufen;festlegen;} öffentliche Uri GetProxy (Uri-Ziel) {zurückgeben _proxy.GetProxy (Ziel);} öffentliches bool IsBypassed (Uri-Host) {zurückgeben _proxy.IsBypassed (Host);}}
Anschließend können Sie etwa Folgendes tun, um die Standard-Proxy-Einstellungen mit benutzerdefinierten Anmeldeinformationen zu verwenden:
// Wie diese eingelesen werden, hängt von der Anwendungszeichenfolge ab: Benutzername = ... SecureString Passwort = ... IWebProxy Proxy = neuer ProxyWrapper(WebRequest.DefaultWebProxy); Proxy.Credentials = neue NetworkCredential(Benutzername, Passwort); WebRequest.DefaultWebProxy = Proxy;
Auf diese Weise können Sie problemlos zu den ursprünglichen Anmeldeinformationen zurückkehren, die in der Datei „app.config“ konfiguriert wurden, oder bei Bedarf einen anderen Satz verwenden.
Beachten Sie, dass dies für Benutzer von .NET zwar recht einfach ist, die Unterstützung von authentifizierenden Proxys (insbesondere solchen, die nur NTLM und Negotiate verwenden) in HTTP-Bibliotheken anderer Sprachen jedoch möglicherweise nicht so einfach ist. In diesen Szenarien hatten einige Benutzer Erfolg mit cntlm als Proxy für den authentifizierenden Proxy.
TL;DR: Wenn Sie Anwendungen in .NET schreiben, sollten Sie in Ihrer Datei app.config einfach useDefaultCredentials=true festlegen, dann sollte das meistens „einfach funktionieren“.
