繁体   English   中英

如何注册将验证域用户的 HttpClient

[英]How to register HttpClient that will authenticate domain user

我必须将 HttpClient 配置为自动传递 Windows 凭据(我正在调用的公司 API 正在使用 Windows 身份验证)。 到目前为止,我在我的方法中创建了 HttpClient,如下所示:

var credentialsCache = new CredentialCache {{
  new Uri("https://localhost"),
  "NTLM",
  CredentialCache.DefaultNetworkCredentials
 }};
var handler = new HttpClientHandler { Credentials = credentialsCache };
var client = new HttpClient(handler);

但由于这可能导致套接字耗尽,我想使用工厂。 因此在Startup.cs我会像这样添加 HttpClient :

public void ConfigureServices(IServiceCollection services)
{
 // ...
 services.AddHttpClient();
}

然后我会通过构造函数将工厂注入到我的服务中:

public class MyService
{
 private readonly IHttpClientFactory clientFactory;
 public MyService(IHttpClientFactory clientFactory)
 {
  this.clientFactory = clientFactory;
 }
 public async Task MakeHttpRequest()
 {
  var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost/endpoint");
  var client = clientFactory.CreateClient();
  var response = await client.SendAsync(request);
  // ...
 }
}

如何配置以这种方式创建的客户端以使用网络凭据? 理想情况下,我只想在ConfigureServices()中配置一次

您可以查看命名客户端并使用ConfigurePrimaryHttpMessageHandler方法

services
    .AddHttpClient("myService")
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler()
    {
        Credentials = credentialsCache
    });

MyService中的HttpClient应该使用给定的名称创建

...
var client = clientFactory.CreateClient("myService");
...

您可以使用选项模式来设置IHttpClientFactory如何创建HttpClient的配置。 您可以通过以下方式配置这些选项

未命名的选项,这些将应用于工厂创建的所有HttpClient实例

services.Configure<HttpClientFactoryOptions>(options =>
{
    options.HttpMessageHandlerBuilderActions.Add(builder =>
    {
        var credentialsCache = new CredentialCache {{
            new Uri("https://localhost"),
            "NTLM",
            CredentialCache.DefaultNetworkCredentials
        }};
        builder.PrimaryHandler = new HttpClientHandler { Credentials = credentialsCache };
    });
});

命名选项,这些仅适用于您将名称传递给工厂上的CreateClient方法的HttpClient实例

services.Configure<HttpClientFactoryOptions>("myclient", options =>
{
    options.HttpMessageHandlerBuilderActions.Add(builder =>
    {
        var credentialsCache = new CredentialCache {{
            new Uri("https://localhost"),
            "NTLM",
            CredentialCache.DefaultNetworkCredentials
        }};
        builder.PrimaryHandler = new HttpClientHandler { Credentials = credentialsCache };
    });
});

要使用命名选项,你会做

var client = clientFactory.CreateClient("myclient");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM