【问题标题】:Making a web request to a web page which requires windows authentication向需要 Windows 身份验证的网页发出 Web 请求
【发布时间】:2011-04-03 13:00:01
【问题描述】:

我正在尝试使用 .net 中的 WebRequest 类向网页发出请求。我试图读取的 url 需要 Windows 身份验证,因此我得到了未经授权的异常。如何将 Windows 凭据传递给此请求,以便它可以进行身份​​验证。

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create( "http://myapp/home.aspx" );

request.Method = "GET";
request.UseDefaultCredentials = false;
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "username", "password", "domain" );

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Raises Unauthorized Exception

this.Response.Write( response.StatusCode );

以上代码返回如下错误。

System.Net.WebException: The remote server returned an error: (401) Unauthorized.

我在检查异常详细信息时注意到一件事,即我尝试访问的 url 正在重定向到另一个 url,这提示我提供 NT 登录详细信息。我相信凭据也应该转发到这个 url。但显然它没有发生。

【问题讨论】:

标签: c# windows-authentication webrequest


【解决方案1】:

您应该使用Credentials 属性将 Windows 凭据传递给 Web 服务。

如果您希望将当前 Windows 用户的凭据传递给服务,那么

request.Credentials = CredentialCache.DefaultCredentials;

应该可以解决问题。否则使用NetworkCredential,如下:

request.Credentials = new NetworkCredential(user, pwd, domain);

【讨论】:

  • 正如您在我发布的代码中看到的那样,我正在使用 NetworkCredential 类来传递我的 Windows 登录信息。但即使这样也行不通。
  • 你后来放了代码吗?我不记得见过。无论如何,401 错误意味着凭据可能是错误的,或者也可能意味着凭据正确但该用户无权访问该 URL。我建议您从浏览器检查您的服务网址。如果它从那里工作,那么它应该与 WebRequest 一起工作。
  • 我编辑了帖子并包含了代码。此外,我可以使用凭据访问浏览器中的 url,但无法使用 WebRequest 执行相同操作。
  • 试试 request.PreAuthenticate = false;推理是服务器抛出 401 作为质询响应,除非此属性为 false,否则 WebRequest 不会响应质询。
  • 运气不好!最后一个建议 - 使用诸如 Fiddler (www.fiddler2.com) 之类的工具,并将来自浏览器(到服务)的请求-响应链与来自 WebRequest 的请求-响应链进行比较。正如您所说,服务可以通过浏览器工作,通过比较请求-响应,您应该知道问题出在哪里。
【解决方案2】:

要对 WebService 进行身份验证,请使用 DefaultNetworkCredentials 而不是 DefaultCredentials:

request.Credentials = CredentialCache.DefaultNetworkCredentials;

【讨论】:

  • 这解决了一个我试图解决一周的问题。谢谢!
  • 我想知道它是否有助于解决我当前的问题:stackoverflow.com/questions/67335532/…?我读到了关于它们之间差异的相互矛盾的东西。我会尽快尝试的。
【解决方案3】:

我正在尝试通过 Windows 凭据访问链接 A。然后链接 A 会自动将我重定向到链接 B,但不会传递我提供的 Windows 凭据。因此错误。我做了request.AutoRedirect = false,每次我在标题中获得位置时都会循环,即每次传递Windows凭据时我都会手动进行重定向。

这对我有用:)

【讨论】:

    【解决方案4】:

    使用 VS2015,request.UseDefaultCredentials = true; 适合我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多