向需要Windows身份验证的网页发出Web请求

49

我正在尝试使用 .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,但显然这并没有发生。


这可能会有所帮助:http://msdn.microsoft.com/zh-cn/library/ff647405.aspx - NullUserException
谢谢,将PreAuthenticate设置为true有助于解决我的问题。 - Michael
4个回答

52

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

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

request.Credentials = CredentialCache.DefaultCredentials;

如果这不起作用,可以使用以下方法NetworkCredential

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

正如您在我发布的代码中所看到的,我正在使用NetworkCredential类来传递我的Windows登录信息。但即使这样也无法正常工作。 - Hemanshu Bhojak
你后来放了代码吗?我不记得看到过。无论如何,401错误意味着凭据可能是错误的,也可能意味着凭据是正确的,但用户没有访问该URL的权限。我建议你从浏览器中检查你的服务URL。如果它在那里可以工作,那么使用WebRequest也应该可以工作。 - VinayC
我编辑了帖子并包含了代码。此外,我能够使用凭据在浏览器中访问URL,但无法使用WebRequest执行相同操作。 - Hemanshu Bhojak
1
尝试使用request.PreAuthenticate = false; 的原因是服务器作为挑战响应抛出了401,而除非此属性为false,否则WebRequest将不会响应该挑战。 - VinayC
检查您在 exception.Response 中的头信息 - 对我来说,我的代理干扰了这个头信息。 - Troy Parsons
显示剩余2条评论

14

使用 DefaultNetworkCredentials 而不是 DefaultCredentials 进行 WebService 的身份验证:

request.Credentials = CredentialCache.DefaultNetworkCredentials;

2
这解决了我一周以来一直在努力解决的问题。谢谢! - empz
我在想它是否可以帮助我解决当前的问题:https://stackoverflow.com/questions/67335532/windows-authentication-website-chrome-iis-and-sharepoint-authentication? 我读到了关于它们之间差异的矛盾信息。 我会尽快尝试。 - AFract

10
我试图使用Windows凭证访问链接A。然后,链接A会自动重定向到链接B,但不会传递我提供的Windows凭证。因此出现错误。为此,我设置了request.AutoRedirect = false,并在每次获取标头中的位置时循环执行重定向,即每次手动重定向并传递Windows凭证。
这对我有效 :)

7
使用VS2015,request.UseDefaultCredentials = true; 对我有效!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接