IIS 7.5 Web应用程序在使用HttpClient时返回未经授权

问题描述:

我有一个Web应用程序,它位于Windows Server 2008 R2上的IIS 7.5中,以及Windows Server 2012 R2上的IIS 8.5中的另一台测试机器上。 已启用Windows身份验证,并且应用程序池正在像“DomainName \ DomainUsername”之类的服务帐户下运行。IIS 7.5 Web应用程序在使用HttpClient时返回未经授权

我正在使用一个小型C#控制台测试应用程序来模拟HttpClient对象并调用网站的控制器操作,例如, http://localhost/Api/TestAction。这两个测试系统的行为不同,我不明白为什么。

  • 测试用例1)无凭证
  • 测试用例2)与 “默认凭证”
  • 测试用例3)与程序池( “域名\ DomainUsername”)的用户的凭证

测试用例1:

HttpClient client = new HttpClient(); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

测试用例2:

HttpClientHandler handler = new HttpClientHandler(); 
handler.UseDefaultCredentials = true; 
HttpClient client = new HttpClient(handler); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

测试用例3:

HttpClientHandler handler = new HttpClientHandler(); 
handler.Credentials = new NetworkCredential(username, password); 
HttpClient client = new HttpClient(handler); 
var response = client.GetAsync(url).Result; 
Console.WriteLine(response.StatusCode); 

下面是结果:

的Windows Server 2008 R2(IIS 7.5):

  • 测试用例1 - 未经授权
  • 测试案例2 - 确定
  • 测试案例3 - 未授权

的Windows Server 2012 R2(IIS 8.5):

  • 测试用例1 - 未经授权
  • 测试案例2 - 正常
  • 测试案例3 - OK

莫非你请帮我理解为什么两个测试系统为测试用例3提供不同的结果(使用apppool用户的凭据)?你能解释一下“UseDefaultCredentials”是什么意思,这对授权问题有什么影响?到目前为止,我还没有找到我理解的解释。

谢谢!

+0

有一些奇怪的代码:要调用GetAsync方法,但没有实施的要求完成处理。一般来说,在处理请求之前,您的响应对象将处于未定义状态。如果你看一下MSDN的方法描述,它会明确指出:“这个操作不会阻塞,返回的任务对象将在读取整个响应(包括内容)后完成。”如果您不想处理请求完成处理程序,则可以改为使用webClient.DownloadData。这是一个不需要完成处理程序的同步操作。 –

+1

@VictorHavin:通过引用异步调用的“结果”,他使它同步并获得异步任务的结果。那时不需要任何完成处理程序。 –

+0

@Delerium:你能否请你验证一下,如果你用三个参数而不是两个来调用NetworkCredentials构造函数,第三个是域名,会发生什么? –

问题下面讨论由OP被接受的答案涉及调用NetworkCredentials构造与参数,而不是两个,第三个是域名。

换句话说,这一个工程

NetworkCredentials("Username", "Password", "Doamin") 

,其中这一个不

NetworkCredentials("Domain\Username", "Password")