【问题标题】:httpwebrequest 401 responsehttpwebrequest 401 响应
【发布时间】:2014-10-16 17:27:30
【问题描述】:

我有一个用 VB.net 编写的程序,它与托管在 IIS 上的数据服务进行交互。身份验证通过用户 Active Directory 凭据处理。在我的一个客户站点上,恰好在一个(大约 100 个)客户工作站上,对数据服务的请求失败,状态为 401。

一些额外的相关信息:生产 IIS 安装分为两个节点。负载均衡器将流量引导到节点。此外,从相关工作站使用 Internet Explorer 发出的完全相同的请求也不会失败。

我怀疑当我通过 VB 代码发出请求时,有些东西正在从请求中删除用户的凭据,但我不知道那可能是什么。

这是我用来发出请求的 VB 代码:

  Dim httpRequest As HttpWebRequest = Nothing
  Dim httpResponse As HttpWebResponse = Nothing

  httpRequest = WebRequest.Create("http://server/xyzportal/portal.php")
  httpRequest.KeepAlive = False
  httpRequest.UseDefaultCredentials = True
  httpRequest.Method = "GET"
  httpRequest.ContentLength = 0
  httpRequest.Accept = "text/xml"
  httpRequest.Timeout = 3000000

  httpResponse = httpRequest.GetResponse

任何想法都将不胜感激。

附加信息:这里是失败请求的 IIS 日志条目。请注意,第二个条目不包括 Windows 用户名:

2014-11-11 22:20:42 199.99.51.58 GET /xyzportal/portal.php - 80 - 199.99.50.128 - 401 2 5 0
2014-11-11 22:20:42 199.99.51.58 GET /xyzportal/portal.php - 80 - 199.99.50.128 - 401 1 2148074248 0

将其与来自工作机器的请求的 IIS 条目进行对比。请注意,第二个条目确实包含 Windows 用户名:

2014-11-11 22:56:40 199.99.51.58 GET /xyzportal/portal.php - 80 - 199.99.50.128 - 401 2 5 0 
2014-11-11 22:56:40 199.99.51.58 GET /xyzportal/portal.php - 80 MYDOMAIN\jreichert 199.99.50.128 - 200 0 0 93

IP 地址为 199.99.50.128 的机器是负载均衡器。

我在两台机器上登录的域和用户完全相同。

【问题讨论】:

  • 我发现如果显式创建凭据 - Dim credentials As NetworkCredential = New NetworkCredential(user, pass) - 然后将凭据分配给 httpWebRequest.Credentials 属性,请求成功。我仍然对为什么这只发生在一台机器上感到困惑。

标签: vb.net httpwebrequest http-status-code-401


【解决方案1】:

您还没有说,但是如果您使用的是代理,那么您还没有告诉 HttpRequest 使用代理的 AD 用户凭据,因此您会收到 401 Unauthorised 错误,即您被拒绝通过代理访问。如果是这样,请尝试明确告诉它...

HttpRequest.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials

我遇到了完全相同的问题,它已经解决了。

【讨论】:

  • 这个答案本身没有用。为什么DefaultCredentials 会解决这个问题?
  • 感谢您的建议。这个解决方案在我的情况下不起作用。 FWIW我不认为请求是通过代理路由的:在控制面板> Internet选项>连接> LAN设置中的工作站上没有设置代理。
【解决方案2】:

keepalive 必须设置为 true。设置 keepalive = true 解决了我的问题。以下页面解释了 keepalive 在身份验证握手中的作用:

http://www.innovation.ch/personal/ronald/ntlm.html

我仍然不确定为什么当 keepalive = false 时请求在我的客户群中

更多信息:当身份验证协议为 Kerebos 时,keepalive 必须设置为 true。如果身份验证协议是 NTLM,则该请求有效。我不知道为什么 Kerebos 只在请求不起作用的两个工作站上使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多