我有一个与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需要用事件处理.
我有以下代码:
var baseUrl = "https://" + GetIdentityProviderHost(environment) + "/oauth2/authorize";
var query = $"?scope=openid&response_type=code&redirect_uri={redirectUrl}&client_id={clientId}";
var combinedUrl = baseUrl + query;
var currentUser = WindowsIdentity.GetCurrent();
await WindowsIdentity.RunImpersonated(currentUser.AccessToken, async() =>
{
using (var client = new WebClient{ UseDefaultCredentials = true })
{
var response = client.DownloadString(combinedUrl);
Console.WriteLine(response);
}
});
Run Code Online (Sandbox Code Playgroud)
它基本上构造一个 URL,然后调用它。
调用返回 401(未授权)。
但是,如果我将其combinedUrl粘贴到 chrome 或 postman 中,它就可以完美运行。这告诉我我的通话可以正常工作,因为 Chrome 正在使用我的 Windows 凭据进行通话。
我添加了WindowsIdentity.RunImpersonated代码来尝试解决这个问题。但是好像没有什么效果。
如何使用集成 Windows 身份验证 (IWA) 进行网络呼叫?
细节:
如果我运行以下 cURL 命令,它会起作用:
curl -L --negotiate -u : …Run Code Online (Sandbox Code Playgroud)