我有一个带有嵌入式webbrowser控件的WPF C#客户端应用程序。我有适当的钩子,所以如果我浏览的网站需要身份验证,我会处理IAuthenticate并传入所需的凭据(用户已经登录到客户端应用程序本身)。这很有效,除了......
如果用户“Bob”通过IE访问该站点并输入其用户名和密码,则有人使用该客户端应用程序并以“Steve”身份登录,“Bob”的会话仍在进行身份验证,并且该站点从未请求新凭据,所以客户端连接为“Bob”。
我真正想要做的是每次嵌入式浏览器连接到此站点时,我都希望发送凭据并强制浏览器和站点使用这些凭据。
有什么想法吗?
请注意,在我需要冒充不同用户时,这在测试期间更是一个问题。
答案 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);
}