4
votes

Authentification par requête à l'aide de HttpClientFactory .net Core 2.1

Comment utiliser HttpClientFactory pour renvoyer une instance de HttpClient dont l'URI et les informations d'identification sont déterminées au moment de l'appel?

Le code existant ressemble à ceci:

var httpClientHandler = new HttpClientHandler()
    {
        Credentials = new NetworkCredential(userName, password),
    };
HttpClient client = new HttpClient(httpClientHandler);
client.BaseAddress = new Uri(_appSetting.ServiceURI);


0 commentaires

3 Réponses :


6
votes

votre méthode ConfigureServices dans la classe de démarrage

 private readonly IHttpClientFactory _httpClientFactory;

        public DataProController(IHttpClientFactory httpClientFactory)
        {
            _httpClientFactory = httpClientFactory;
        }

        [HttpGet]
        public async Task<ActionResult> Get()
        {            
            var client = _httpClientFactory.CreateClient("github");
            
            client.BaseAddress = new Uri("https://api.github.com/");

            string result = await client.GetStringAsync("/");
            return Ok(result);
        }

Votre contrôleur ressemblera à ceci

             services.AddHttpClient("github", c =>
            {
                //c.BaseAddress = new Uri("https://api.github.com/");
                c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
                c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
                
            }).ConfigurePrimaryHttpMessageHandler(() =>
            {
                return new HttpClientHandler()
                {
                    UseDefaultCredentials = true,
                    Credentials = new NetworkCredential("", ""),
                };
            });

Vous ne pourrez peut-être pas configurer les informations d'identification réseau au moment de l'exécution lorsque vous utilisez httpclientfactory et devrez peut-être configurer dans la classe de démarrage. vous pouvez trouver ce problème ici. https://github.com/aspnet/HttpClientFactory/issues/71


0 commentaires

2
votes

Si vous utilisez l'injection de dépendances .net, vous pouvez ajouter la configuration d'une classe dans votre code de configuration:

    public class DataLoader
    {
        private readonly HttpClient httpClient;

        public DataLoader(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }

        public async Task LoadData(string tableName)
        {
            var json = await httpClient.GetStringAsync("https://protected.example.com/json");
            ...
        }
    }

Ajouter maintenant le DI injectera un HttpClient qui utilise ces informations d'identification dans la classe DataLoader :

services
    .AddTransient<DataLoader>()
    .AddHttpClient<DataLoader>().ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler()
{
    Credentials = new NetworkCredential(LoadUsernameFromConfig(), LoadPasswordFromSecureLocation())
});

(je ne pourrais pas trouver ce code si je n'avais pas la réponse de Imran Arshad : Merci!)


0 commentaires

0
votes

Vous pouvez créer un gestionnaire de délégation d'authentification comme celui-ci:

 services
     .AddTransient<AuthenticationHttpMessageHandler>()
     .AddHttpClient("MyClient")
     .AddHttpMessageHandler<AuthenticationHttpMessageHandler>();

puis l'ajouter au générateur HttpClient et au conteneur DI:

public class AuthenticationHttpMessageHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            // Get the token or other type of credentials here
            // string scheme = ... // E.g. "Bearer", "Basic" etc.
            // string credentials = ... // E.g. formatted token, user/password etc.

            request.Headers.Authorization =
                new AuthenticationHeaderValue(scheme, credentials);

            return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
        }
    }

puis utilisez IHttpClientFactory pour créer des instances HttpClient.

Le principal avantage de cette approche est que vous séparez clairement les préoccupations. Vous ne touchez pas au gestionnaire principal, vous ne gérez pas la création de client manuellement, vous utilisez toute la puissance de l'usine et de ses méthodes d'extension de générateur. Le gestionnaire d'authentification est naturellement injecté dans le pipeline et ajoute une autorisation à chaque requête. Ce gestionnaire peut être amélioré en supprimant la source des informations d'identification et en faisant dépendre le gestionnaire d'une abstraction IAuthenticationProvider, qui ne nécessitera qu'une configuration DI et ne touche pas le code de configuration HttpClient.


0 commentaires