代理不接受提供的凭据。 C#remoting

时间:2015-10-19 12:33:07

标签: c# proxy remoting

我遇到了代理服务器的问题,该代理服务器不接受我的应用程序提供的身份验证详细信息。这就是我正在做的事情:

    private bool DoLoginTest(WebProxy wp = null)
    {
        if(MMremotingClient.LoginWCP(wp) == AdminNetworkFlags.CLIENTPOS)
        {
            FL.Log("Test licensing server connection REM finished");
            FL.Log("Connection could be established successfully");

            MMremotingClient.DoTask(BitConverter.GetBytes((int)AdminNetworkFlags.CLIENTEND), "Nothing");
            MMremotingClient.DisableFLogging();
            Invoke(txtDelegate, " finished\r\n");
            return true;
        }
        else
        {
            FL.Log("Test server connection failed!");
            FL.Log("NoTask");
            Invoke(txtDelegate, " failed\r\n");
            Invoke(MBDelegate, "Could not reach the licencing server. Please make sure that no firewall is blocking port 80, or that your computer is allowed to access the internet.");
            return false;
        }
    }

在一系列测试中,我尝试使用旧的远程协议连接到服务器(无法升级到WCF)。如果DoLoginTest方法失败,用户将看到一个小形式,他可以在其中输入注入HTTPClientChannel对象的代理详细信息。然后另一个尝试连接到服务器。

    public static AdminNetworkFlags LoginWCP(WebProxy wProx = null)
    {
        FileLogger.Log("MMLC: LoginWCP");
        Register(wProx);
        return Login();
    }

    private static void Register(WebProxy iwp = null)
    {
        FileLogger.Log("MMLC: Register");
        try
        {
            IDictionary props = new Hashtable();

            if(iwp == null)
            {
                props["useDefaultCredentials"] = true;
            }
            else
            {
                NetworkCredential nc = (NetworkCredential)iwp.Credentials;
                if(nc != null)
                {
                    props["domain"] = nc.Domain ?? null;
                    props["password"] = nc.Password;
                    props["username"] = nc.UserName;
                    props["useDefaultCredentials"] = false;
                }
                else
                {
                    props["domain"] = null;
                    props["password"] = "1234";
                    props["username"] = "u.name";
                    props["useDefaultCredentials"] = false;
                }
            }
            ServicePointManager.Expect100Continue = false;
            HttpChan = new HttpClientChannel(props, new BinaryClientFormatterSinkProvider());
            SetChannelProxy(HttpChan, iwp ?? WebRequest.GetSystemWebProxy());
            FileLogger.Log("MMLC: RegChannel");
            ChannelServices.RegisterChannel(HttpChan, true);
            RemoteObject = (IRemObject)Activator.GetObject(typeof(IRemObject), "http://someAdress:80/IRemObject");
            FileLogger.Log("MMLC: connected");
        }
        catch(Exception x)
        {
            Trace.WriteLine("Error connecting to remote server, reason: " + x.Message);
            RemoteObject = null;
        }
    }

    private static void SetChannelProxy(HttpClientChannel channel, IWebProxy proxy)
    {
        FieldInfo proxyObjectFieldInfo = typeof(HttpClientChannel).GetField("_proxyObject", BindingFlags.Instance | BindingFlags.NonPublic);
        proxyObjectFieldInfo.SetValue(channel, proxy);
    } 

这是要求用户提供代理详细信息的表单。如果用户点击它上面的“确定”按钮结束它,则设置定义的代理属性。然后将该属性传递给LoginWCP()函数。

    private void button1_Click(object sender, EventArgs e)
    {
        definedProxy = new WebProxy(txtAdress.Text, decimal.ToInt32(nudPort.Value));
        Address = txtAdress.Text;
        Port = decimal.ToInt32(nudPort.Value);
        NetworkCredential nc = new NetworkCredential()
        {
            Domain = string.IsNullOrWhiteSpace(txtDomain.Text) ? null : txtDomain.Text,
            UserName = txtName.Text,
            Password = txtPassword.Text
        };
        definedProxy.Credentials = nc;
        DialogResult = System.Windows.Forms.DialogResult.OK;
        Close();
    }

到目前为止,这工作正常,但现在我有第一个用户在Active Directory环境中使用代理。由于我缺少AD,我无法在其中测试应用程序。所以我问你,我的申请有什么问题吗?我需要检查用户ipnut的东西吗?是Expect100Continue = false做坏事吗?

1 个答案:

答案 0 :(得分:0)

因此,这件事再次发生,但是这次可以解决。首先,我必须给罪魁祸首命名,这让我很难受。 ZScaler。该软件套件围绕阻止和嗅探从内部和外部的连接而构建,似乎只允许连接到地址,而不是直接IP。到目前为止,我的应用程序直接连接到IP,而不是真正的地址。某些更改之后,我的服务器现在可以通过地址浏览,并且ZScaler的代理可以通过该应用程序。