Fornecendo seu próprio HttpClient, dando suporte a proxies HTTP e personalização de cabeçalhos de agente de usuário

Há casos em que os desenvolvedores querem um controle mais detalhado da instância de HttpClient, como configurar um proxy ou usar os mecanismos eficientes do ASP.NET Core para pool de instâncias do HttpClient. Você pode ler mais no documento HttpClientFactory para implementar requisições HTTP resilientes. Para personalizar HttpClient, os desenvolvedores precisarão implementar IMsalHttpClientFactory, que a MSAL usará para obter um(a) HttpClient para cada solicitação HTTP.

Diretrizes de implementação do IMsalHttpClientFactory

Exemplo de implementação

IMsalHttpClientFactory httpClientFactory = new MyHttpClientFactory();

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

Uma implementação simples de 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

Ao usar o Xamarin iOS, é recomendável criar um HttpClient que use explicitamente o manipulador baseado em NSURLSession para o iOS 7 e versões posteriores. MSAL.NET cria automaticamente um HttpClient que usa NSURLSessionHandler para iOS 7 e mais recente. Para obter mais informações, leia a documentação do Xamarin iOS para HttpClient.

Troubleshooting

Problema: em um aplicativo da área de trabalho, a experiência de autorização não usa o HttpClient que eu defini

Solução:

Em aplicativos móveis e desktop, a MSAL abre um navegador e navega até a URL de autorização. Ele não usa HttpClient. Ao usar o navegador incorporado, você pode controlar o proxy dele seguindo a técnica em: https://blogs.msdn.microsoft.com/jpsanders/2011/04/26/how-to-set-the-proxy-for-the-webbrowser-control-in-net/ Isso não pode ser alcançado no .NET Core, onde somente o navegador do sistema está disponível. A MSAL não tem controle sobre o navegador do sistema.

Problema: meu navegador pode se conectar ao proxy, mas recebo erros HTTP 407 da MSAL

Solução: HTTP 407 mostra um problema de autenticação de proxy. O .NET Framework usa as configurações de proxy do Internet Explorer, que, por padrão, não incluem a configuração "UseDefaultCredential". Alguns usuários relataram a correção desse problema adicionando o seguinte ao arquivo .config:

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