[#7258][Web]: Fix proxy authentication for non-ssl sessions
authorMartin Baulig <martin.baulig@xamarin.com>
Tue, 23 Oct 2012 23:17:38 +0000 (01:17 +0200)
committerMartin Baulig <martin.baulig@xamarin.com>
Tue, 23 Oct 2012 23:17:38 +0000 (01:17 +0200)
Thanks a lot to Christian Gan for this patch :-)

mcs/class/System/System.Net/DigestClient.cs
mcs/class/System/System.Net/WebConnectionGroup.cs

index ef7438277218e42d1b9353a98e009f801a8afd77..903d52755b942ad10c78d31fa8cb21b8471662c1 100644 (file)
@@ -413,13 +413,16 @@ namespace System.Net
                        if (request == null)
                                return null;
 
-                       int hashcode = request.Address.GetHashCode () ^ credentials.GetHashCode ();
+                       DigestSession currDS = new DigestSession();
+                       if (!currDS.Parse (challenge))
+                               return null;
+
+                       int hashcode = request.Address.GetHashCode () ^ credentials.GetHashCode () ^ currDS.Nonce.GetHashCode ();
                        DigestSession ds = (DigestSession) Cache [hashcode];
                        bool addDS = (ds == null);
                        if (addDS)
-                               ds = new DigestSession ();
-
-                       if (!ds.Parse (challenge))
+                               ds = currDS;
+                       else if (!ds.Parse (challenge))
                                return null;
 
                        if (addDS)
index 39253cbad22a8cb2e1880edc5eb6a97a2ece66ee..ee17b99816641e96697ed91b7c2396e8def5aa5c 100644 (file)
@@ -110,8 +110,13 @@ namespace System.Net
 
                        bool needs_reset = false;
                        NetworkCredential cnc_cred = cnc.NtlmCredential;
-                       NetworkCredential req_cred = request.Credentials.GetCredential (request.RequestUri, "NTLM");
-                       if (cnc_cred.Domain != req_cred.Domain || cnc_cred.UserName != req_cred.UserName ||
+
+                       bool isProxy = (request.Proxy != null && !request.Proxy.IsBypassed (request.RequestUri));
+                       ICredentials req_icreds = (!isProxy) ? request.Credentials : request.Proxy.Credentials;
+                       NetworkCredential req_cred = (req_icreds != null) ? req_icreds.GetCredential (request.RequestUri, "NTLM") : null;
+
+                       if (cnc_cred == null || req_cred == null ||
+                               cnc_cred.Domain != req_cred.Domain || cnc_cred.UserName != req_cred.UserName ||
                                cnc_cred.Password != req_cred.Password) {
                                needs_reset = true;
                        }