0

我有一个带有 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;
    }
4

0 回答 0