Fornire il proprio HttpClient, supportare proxy HTTP e personalizzare gli header User-Agent

In alcuni casi gli sviluppatori desiderano un controllo dettagliato dell'istanza HttpClient, ad esempio per configurare un proxy o utilizzare i metodi efficienti di ASP.NET Core per il pooling di HttpClient. Per ulteriori informazioni, vedere il documento HttpClientFactory per implementare richieste HTTP resilienti. Per personalizzare HttpClient, gli sviluppatori dovranno implementare IMsalHttpClientFactory, che MSAL utilizzerà quindi per ottenere un HttpClient per ogni richiesta HTTP.

Linee guida per l'implementazione di IMsalHttpClientFactory

Implementazione di esempio

IMsalHttpClientFactory httpClientFactory = new MyHttpClientFactory();

var pca = ConfidentialClientApplication.Create("client_id") 
                                        .WithHttpClientFactory(httpClientFactory)
                                        .Build();

Una semplice implementazione di IMsalHttpClientFactory

public class StaticClientWithProxyFactory : IMsalHttpClientFactory
{
    private static readonly HttpClient s_httpClient;

    static StaticClientWithProxyFactory()
    {
        var webProxy = new WebProxy(
            new Uri("http://my.proxy"),
            BypassOnLocal: false);

        webProxy.Credentials = new NetworkCredential("user", "pass");

        var proxyHttpClientHandler = new HttpClientHandler
        {
            Proxy = webProxy,
            UseProxy = true,
        };

        s_httpClient = new HttpClient(proxyHttpClientHandler);
        
    }

    public HttpClient GetHttpClient()
    {
        return s_httpClient;
    }
}

HttpClient e Xamarin iOS

Quando si usa Xamarin iOS, è consigliabile creare un oggetto HttpClient che usa esplicitamente il gestore basato su NSURLSession per iOS 7 e versioni successive. MSAL.NET crea automaticamente un oggetto HttpClient che usa NSURLSessionHandler per iOS 7 e versioni successive. Per altre informazioni, vedere la documentazione di Xamarin iOS per HttpClient.

Troubleshooting

Problema: in un'applicazione desktop, l'esperienza di autorizzazione non usa l'HttpClient che ho definito

Soluzione:

Nelle app desktop e per dispositivi mobili, MSAL apre un browser e passa all'URL di autorizzazione. Non utilizza HttpClient. Quando si usa il browser incorporato, è possibile controllarne il proxy seguendo la procedura descritta in: https://blogs.msdn.microsoft.com/jpsanders/2011/04/26/how-to-set-the-proxy-for-the-webbrowser-control-in-net/ Questo non è possibile in .NET Core, dove è disponibile solo il browser di sistema. MSAL non ha alcun controllo sul browser di sistema.

Problema: il browser può connettersi al proxy, ma si ricevono errori HTTP 407 da MSAL

Soluzione: HTTP 407 mostra un problema di autenticazione proxy. .NET framework usa le impostazioni proxy di Internet Explorer, che per impostazione predefinita non include l'impostazione "UseDefaultCredential". Alcuni utenti hanno segnalato la risoluzione di questo problema aggiungendo quanto segue al file .config:

<system.net>
        <defaultProxy enabled="true" useDefaultCredentials="true" />  
</system.net>