独自の HttpClient の提供、HTTP プロキシのサポート、ユーザー エージェント ヘッダーのカスタマイズ

開発者は、プロキシの構成や、HttpClientをプールする ASP.NET Coreの効率的な方法の使用など、HttpClient インスタンスをきめ細かく制御する必要がある場合があります。 HttpClientFactory で回復性のある HTTP 要求ドキュメントを実装する方法の詳細を確認できます。 HttpClientをカスタマイズするには、開発者がIMsalHttpClientFactoryを実装する必要があります。この場合、MSAL は各 HTTP 要求のHttpClientを取得するために使用します。

IMsalHttpClientFactory の実装ガイドライン

  • ASP.NET CoreのSystem.Net.Http.HttpClientなど、このインターフェイスに適合できるスケーラブルなIHttpClientFactory例については、を参照してください。
  • 実装はスレッド セーフである必要があります。
  • HttpClientに新しいGetHttpClientを作成しないでください。これによりポートが枯渇します。
  • MSAL は、Dispose()HttpClientを呼び出しません。
  • アプリで統合Windows認証を使用している場合は、System.Net.Http.HttpClientHandler.UseDefaultCredentialstrue に設定されていることを確認します。

実装例

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 を使用する場合は、iOS 7 以降のHttpClient ベースのハンドラーを明示的に使用するNSURLSessionを作成することをお勧めします。 MSAL.NET は、iOS 7 以降では NSURLSessionHandler を使用する HttpClient を自動的に作成します。 詳細については、httpClient の Xamarin iOS ドキュメントを参照してください。

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 は、システム ブラウザーを制御しません。

問題: ブラウザーがプロキシに接続できますが、MSAL から HTTP 407 エラーが発生する

解決策: HTTP 407 にプロキシ認証の問題が表示されます。 .NET フレームワークでは、IE のプロキシ設定が使用されます。既定では、"UseDefaultCredential" 設定は含まれません。 一部のユーザーは、.config ファイルに以下を追加して、この問題の修正を報告しています。

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