1

我有一个带有嵌入式 webbrowser 控件的 WPF C# 客户端应用程序。我有所有适当的钩子,因此如果我正在浏览的站点需要身份验证,我会处理 IAuthenticate 并传递所需的凭据(用户已经登录到客户端应用程序本身)。这很好用,除了...

如果用户“Bob”通过 IE 访问该站点并输入他的用户名和密码,那么有人使用客户端应用程序并以“Steve”身份登录,“Bob”的会话仍然经过身份验证,并且该站点从不要求新的凭据,所以客户端连接为“鲍勃”。

我真正想做的是每次嵌入式浏览器连接到该站点时,我都想发送凭据并强制浏览器和站点使用这些凭据。

有任何想法吗?

请注意,当我需要模拟不同的用户时,这在测试期间会成为一个更大的问题。

4

2 回答 2

2

使用Kerr 凭证

于 2010-09-07T17:07:26.590 回答
0

您需要做的第一件事是将代理的用户凭据写入 Windows 用户凭据缓存。

 public static void SetCredentials(string username, string password, string proxydomain)
    {
        Credential deleteCredentials = new Credential
        {
            Target = proxydomain
        };
        if (deleteCredentials.Exists())
            deleteCredentials.Delete();

        Credential proxyCredential = new Credential
        {

            Username = username,
            Password = password ,
            Target = proxydomain,
            Type = CredentialType.Generic,
            PersistanceType = PersistanceType.Enterprise
        };
        proxyCredential.Save();


    }

那么您需要将信息添加到注册表中。

 public static void setProxyRegistry(string proxyhost, bool proxyEnabled, string username, string password)
    {
        const string userRoot = "HKEY_CURRENT_USER";
        const string subkey = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
        const string keyName = userRoot + "\\" + subkey;

        Registry.SetValue(keyName, "ProxyServer", proxyhost, RegistryValueKind.String);
        Registry.SetValue(keyName, "ProxyEnable", proxyEnabled ? "1" : "0", RegistryValueKind.DWord);

        if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
        {
            Registry.SetValue(keyName, "ProxyPass", password, RegistryValueKind.String);
            Registry.SetValue(keyName, "ProxyUser", username, RegistryValueKind.String);
        }

        //<-loopback>;<local>
        Registry.SetValue(keyName, "ProxyOverride", "*.local", RegistryValueKind.String);


        // These lines implement the Interface in the beginning of program 
        // They cause the OS to refresh the settings, causing IP to realy update
        InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
        InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
    }
于 2017-03-14T15:16:57.870 回答