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”是什么意思,这对授权问题有什么影响?到目前为止,我还没有找到我理解的解释。
谢谢!
答
问题下面讨论由OP被接受的答案涉及调用NetworkCredentials
构造与参数,而不是两个,第三个是域名。
换句话说,这一个工程
NetworkCredentials("Username", "Password", "Doamin")
,其中这一个不
NetworkCredentials("Domain\Username", "Password")
有一些奇怪的代码:要调用GetAsync方法,但没有实施的要求完成处理。一般来说,在处理请求之前,您的响应对象将处于未定义状态。如果你看一下MSDN的方法描述,它会明确指出:“这个操作不会阻塞,返回的任务对象将在读取整个响应(包括内容)后完成。”如果您不想处理请求完成处理程序,则可以改为使用webClient.DownloadData。这是一个不需要完成处理程序的同步操作。 –
@VictorHavin:通过引用异步调用的“结果”,他使它同步并获得异步任务的结果。那时不需要任何完成处理程序。 –
@Delerium:你能否请你验证一下,如果你用三个参数而不是两个来调用NetworkCredentials构造函数,第三个是域名,会发生什么? –