我有一个带有 WebBrowser 控件的 WPF 窗口。我想导航到需要身份验证的页面,但我想自动登录用户。
byte[] authData = Encoding.UTF8.GetBytes(UserName + ":" + Password);
_header = "Authorization: Basic " + Convert.ToBase64String(authData);
Browser.Navigate(url, string.Empty, null, _header);
问题是即使我提供了 Authorization 标头,WebBrowser 仍会提示输入用户名和密码。我将代码中的用户名和密码输入到提示符中,并且我通过了身份验证(所以我没有任何拼写错误)。
该站点在具有基本身份验证和 https 的 IIS 中运行。
在 fiddler 中查看流量后,我看到的第一个请求有一个 304 状态代码,并且存在 Authorization 标头。此请求之后是返回 401 状态代码的第二个请求。对于此请求,没有 Authorization 标头。
任何人都知道下面的缓存标头来自哪里?我没有添加它们,我认为它们导致了问题。
来自 Fiddler 的第一个请求标头
缓存If-Modified-Since:2013 年 6 月 4 日星期二 19:52:22 GMT If-None-Match:“527fa775d61ce1:0”
Client Accept: / Accept-Encoding: gzip, deflate Accept-Language: en-US User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;AskTbORJ/5.15.23.36191;MDDRJS)
Cookies/登录授权:基本 T25saW5lSGVscFVzZXI6SG93Q2FuSUhlbHBZb3Uh
传输连接:Keep-Alive 主机:docs.newcenturysoftware.com
来自 Fiddler 的第二个请求标头
Client Accept: / Accept-Encoding: gzip, deflate Accept-Language: User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729;.NET CLR 3.0.30729;媒体中心 PC 6.0;.NET4.0C;.NET4.0E;AskTbORJ/5.15.23.36191;MDDRJS)
其他推荐人:https ://docs.newcenturysoftware.com/
传输连接:Keep-Alive 主机:docs.newcenturysoftware.com
如果您需要任何其他信息,请告诉我。谢谢。
编辑 如果以下评论中提到的重定向的这种预期行为,也许更好的问题是为什么重定向首先发生?我们可以在 IIS 中更改设置以防止重定向吗?
第一个请求是到https://docs.newcenturysoftware.com/ 第二个请求是到https://docs.newcenturysoftware.com/welcome.png(只是默认的 iis 图像)。
注意 - 当我浏览到 IE 或 Chrome 中的页面时,我没有收到重定向。
用“修复”编辑 2
由于由于防火墙重定向而需要重定向,并且重定向似乎也需要删除的授权标头,因此我通过侦听 Browser.Navigated 事件并使用标头信息再次重新发送请求来修复我的代码。
void BrowserNavigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
//Handle the dropped authorization header for the first request (because of firewall redirect)
//and resend the request with the authorization again.
_docWindow.Browser.Navigate(e.Uri, string.Empty, null, _header);
_docWindow.Browser.Navigated -= BrowserNavigated;
}