我有一个与Windows服务对话的Web应用程序(在IIS中托管).Windows服务使用ASP.Net MVC Web API(自托管),因此可以使用JSON通过http进行通信.Web应用程序配置为进行模拟,其想法是向Web应用程序发出请求的用户应该是Web应用程序用来向服务发出请求的用户.结构如下所示:

(以红色突出显示的用户是以下示例中引用的用户.)
Web应用程序使用以下命令向Windows服务发出请求HttpClient:
var httpClient = new HttpClient(new HttpClientHandler()
{
UseDefaultCredentials = true
});
httpClient.GetStringAsync("http://localhost/some/endpoint/");
Run Code Online (Sandbox Code Playgroud)
这会向Windows服务发出请求,但不会正确传递凭据(服务将用户报告为IIS APPPOOL\ASP.NET 4.0).这不是我想要发生的事情.
如果我将上述代码更改为使用WebClient,则会正确传递用户的凭据:
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
c.DownloadStringAsync(new Uri("http://localhost/some/endpoint/"));
Run Code Online (Sandbox Code Playgroud)
使用上述代码,服务将用户报告为向Web应用程序发出请求的用户.
我执行错误HttpClient导致它无法正确传递凭据(或者它是一个错误HttpClient),我做错了什么?
我想使用HttpClient它的原因是它有一个与s兼容的异步API Task,而WebClientasyc API需要用事件处理.
我有一个ASP.NET Web API服务,它在启用了Windows身份验证的Web服务器上运行.
我有一个基于MVC4构建的客户端站点,它运行在同一Web服务器上的不同站点上,该站点使用HttpClient从服务中提取数据.此客户端站点在启用身份模拟的情况下运行,并且还使用Windows身份验证.
Web服务器是带有IIS 7.5的Windows Server 2008 R2.
我遇到的挑战是让HttpClient通过当前的Windows用户作为其身份验证过程的一部分.我已经以这种方式配置了HttpClient:
var clientHandler = new HttpClientHandler();
clientHandler.UseDefaultCredentials = true;
clientHandler.PreAuthenticate = true;
clientHandler.ClientCertificateOptions = ClientCertificateOption.Automatic;
var httpClient = new HttpClient(clientHandler);
Run Code Online (Sandbox Code Playgroud)
我的理解是,在启用了身份模拟的情况下运行站点,然后以这种方式构建客户端应该导致客户端使用当前登录用户的模拟身份对服务进行身份验证.
这不会发生.事实上,客户端似乎根本没有进行身份验证.
该服务配置为使用Windows身份验证,这似乎完美.我可以在我的网络浏览器中访问http:// server/api/shippers并提示进行Windows身份验证,输入后我会收到请求的数据.
在IIS日志中,我看到收到的API请求没有进行身份验证并收到401质询响应.
关于这个的文档似乎很少.
我需要深入了解可能出现的问题或使用此应用程序使用Windows身份验证的其他方法.
谢谢,克雷格
windows-authentication iis-7.5 wcf-web-api asp.net-mvc-4 asp.net-web-api
我的应用程序与需要身份验证的内部Web API进行通信.
当我发送请求时,我按预期获得401质询,发生握手,重新发送经过身份验证的请求,一切都继续正常.
但是,我知道 auth是必需的.为什么我要等待挑战?我可以强制请求在第一个请求中发送凭据吗?
我的请求生成是这样的:
private static HttpWebRequest BuildRequest(string url, string methodType)
{
var request = HttpWebRequest.CreateHttp(url);
request.PreAuthenticate = true;
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Proxy.Credentials = CredentialCache.DefaultNetworkCredentials;
request.ContentType = CONTENT_TYPE;
request.Method = methodType;
request.UserAgent = BuildUserAgent();
return request;
}
Run Code Online (Sandbox Code Playgroud)
即使使用此代码,auth标头也不包含在初始请求中.
我知道如何将auth信息包含在基本....我想要做的是使用执行应用程序的用户的Windows Auth(所以我不能将密码存储在配置文件中).
更新我还尝试使用a HttpClient和它自己的.Credentials属性,结果相同:没有auth头添加到初始请求.
我可以获得auth标头的唯一方法是使用基本身份验证手动破解它(在这种情况下不会飞行)