MSAL.NET は HTTP トランスポートを IMsalHttpClientFactory から取得できます。プロキシ用に構成したクライアントをラップします。

sealed class TokenHttpFactory : IMsalHttpClientFactory
{
    private readonly HttpClient client;

    public TokenHttpFactory(HttpClient client)
    {
        this.client = client;
    }

    public HttpClient GetHttpClient() => client;
}

ハンドラーとクライアントをアプリケーションの有効期間中に一度だけ作成し、既存の MSAL ビルダー構成の際にファクトリを接続します。

var proxy = new WebProxy("http://proxy.example:8080");
var handler = new HttpClientHandler { Proxy = proxy, UseProxy = true };
var tokenHttp = new HttpClient(handler);

builder.WithHttpClientFactory(new TokenHttpFactory(tokenHttp));

ビルダーはアプリケーションの既存の MSAL アプリケーション ビルダーです。その authority、クライアント登録、資格情報の構成を維持します。プロキシ アカウントを使わない、許可された一般公開の HTTPS authority ルートでは、HTTP プロキシ一覧の HTTP アドレスを例の WebProxy に充てられます。 必要に応じて WebProxy にプロキシ資格情報を構成します。

ファクトリはスレッド セーフでなければなりません。GetHttpClient 呼び出しごとに新しく作るのではなく、クライアントを再利用します。MSAL は渡されたクライアントを破棄しません。その有効期間は所有者が管理します。

これは MSAL の HTTP 要求を制御します。対話型サインインは、ネットワークが別であるブラウザーを開くことがあります。したがってブラウザーでのサインイン成功は、トークンの HTTP クライアントが同じ経路を使うことを証明しません。

関連記事