Предоставление собственных httpClient, поддержка прокси-серверов HTTP и настройка заголовков агента пользователя

Бывают случаи, когда разработчикам требуется более тонко управлять экземпляром HttpClient, например настроить прокси или использовать эффективные механизмы ASP.NET Core для пула HttpClient. Дополнительные сведения см. в документе HttpClientFactory для реализации отказоустойчивых HTTP-запросов. Чтобы настроить HttpClient, разработчикам потребуется реализовать IMsalHttpClientFactory, который MSAL будет использовать для получения HttpClient каждого HTTP-запроса.

Рекомендации по реализации IMsalHttpClientFactory

Пример реализации

IMsalHttpClientFactory httpClientFactory = new MyHttpClientFactory();

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

Простая реализация 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 и Xamarin iOS

При использовании Xamarin iOS рекомендуется создать HttpClient, который явно использует обработчик на основе NSURLSession для iOS 7 и более новых версий. MSAL.NET автоматически создает объект HttpClient, использующий NSURLSessionHandler в iOS 7 и более поздних версиях. Дополнительные сведения см. в документации по Xamarin iOS для HttpClient.

Troubleshooting

Проблема: в настольном приложении процесс авторизации не использует определённый мной HttpClient

Решение:

В классических и мобильных приложениях MSAL открывает браузер и переходит к URL-адресу авторизации. Он не использует HttpClient. При использовании встроенного браузера вы можете настроить для него прокси, следуя описанному здесь способу: https://blogs.msdn.microsoft.com/jpsanders/2011/04/26/how-to-set-the-proxy-for-the-webbrowser-control-in-net/ Это невозможно в .NET Core, где доступен только системный браузер. MSAL не контролирует системный браузер.

Проблема. Мой браузер может подключиться к прокси-серверу, но у меня возникают ошибки HTTP 407 из MSAL

Решение: HTTP 407 показывает проблему проверки подлинности прокси-сервера. .NET платформа использует параметры прокси-сервера из IE, которые по умолчанию не включают параметр UseDefaultCredential. Некоторые пользователи сообщили об устранении этой проблемы, добавив в файл .config следующее:

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