如何强制使用基于IE的Web浏览器控件来使用特定的身份验证凭据?

时间:2010-09-07 15:50:43

标签: c# internet-explorer authentication webbrowser-control http-authentication

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

如果用户“Bob”通过IE访问该站点并输入其用户名和密码,则有人使用该客户端应用程序并以“Steve”身份登录,“Bob”的会话仍在进行身份验证,并且该站点从未请求新凭据,所以客户端连接为“Bob”。

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

有什么想法吗?

请注意,在我需要冒充不同用户时,这在测试期间更是一个问题。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分: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);
    }