Udostępnianie własnego klienta HttpClient, obsługę serwerów proxy HTTP i dostosowywanie nagłówków agenta użytkownika

Zdarzają się sytuacje, w których deweloperzy chcą mieć szczegółową kontrolę nad wystąpieniem HttpClient, na przykład w celu skonfigurowania serwera proxy lub skorzystania z wydajnych mechanizmów ASP.NET Core do tworzenia puli obiektów HttpClient. Więcej informacji można przeczytać w dokumencie HttpClientFactory w celu zaimplementowania odpornych żądań HTTP . Aby dostosować HttpClient, deweloperzy będą musieli zaimplementować IMsalHttpClientFactory, którego biblioteka MSAL następnie użyje do uzyskania HttpClient dla każdego żądania HTTP.

Wytyczne implementacji IMsalHttpClientFactory

Przykładowa implementacja

IMsalHttpClientFactory httpClientFactory = new MyHttpClientFactory();

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

Prosta implementacja 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 i Xamarin iOS

Podczas korzystania z Xamarin.iOS zaleca się utworzenie elementu HttpClient, który jawnie używa programu obsługi opartego na NSURLSession dla systemu iOS 7 i nowszych. MSAL.NET automatycznie tworzy obiekt HttpClient, który używa NSURLSessionHandler, w systemie iOS 7 i nowszych. Aby uzyskać więcej informacji, przeczytaj dokumentację Xamarin systemu iOS dla klienta HttpClient.

Troubleshooting

Problem: W aplikacji komputerowej proces autoryzacji nie używa obiektu HttpClient, który zdefiniowałem

Rozwiązanie:

W aplikacjach klasycznych i mobilnych biblioteka MSAL otwiera przeglądarkę i przechodzi do adresu URL autoryzacji. Nie używa składnika HttpClient. W przypadku korzystania z osadzonej przeglądarki można kontrolować dla niej serwer proxy, stosując technikę opisaną tutaj: https://blogs.msdn.microsoft.com/jpsanders/2011/04/26/how-to-set-the-proxy-for-the-webbrowser-control-in-net/ Nie jest to możliwe w .NET Core, gdzie dostępna jest tylko przeglądarka systemowa. Biblioteka MSAL nie ma kontroli nad przeglądarką systemową.

Problem: Moja przeglądarka może nawiązać połączenie z serwerem proxy, ale otrzymuję błędy HTTP 407 z biblioteki MSAL

Rozwiązanie: PROTOKÓŁ HTTP 407 pokazuje problem z uwierzytelnianiem serwera proxy. .NET framework używa ustawień serwera proxy z programu IE, które domyślnie nie zawiera ustawienia "UseDefaultCredential". Niektórzy użytkownicy zgłosili rozwiązanie tego problemu, dodając następujące informacje do pliku .config:

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