xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Basic 認証情報を含む URL を HttpClient で利用する

Basic 認証のあるページにブラウザでアクセスしたことがある方はご存じかと思いますが、以下のような認証情報を入力するダイアログが表示されます。毎度面倒ですよね。

f:id:xin9le:20210308230408p:plain

実は、ブラウザなど一部の Web Client は https://UserName:Password@example.com のような認証情報を URL に書く記法をサポートしています。こうすると認証ダイアログが表示されないので、大変便利です。

Uri クラスで parse する

C# / .NET でも上記のような URL を使いたいなーと考えるわけですが、URL から認証情報 UserName:Password を抜き出すのが大変手間そうです。...しかし!実は Uri クラス が中でも最も面倒な URL の parse 処理をやってくれるので全然難しくありません!

var uri = new Uri("https://UserName:Password@example.com");
Console.WriteLine(uri.UserInfo);  // UserName:Password

これは捗る...!

HttpClient で利用する

こうなってくると「是非 HttpClient でも!」と思うわけですが、当然の如く (?) サポートされていません。残念ながら自前実装するしかないです。と言っても認証情報の取り出しが簡単にできることが分かっているので、あとは Base64 エンコードをしてあげるだけです。例えば以下のようになります。

var uri = new Uri("https://UserName:Password@example.com");
var client = new HttpClient();

// 認証情報の指定がない場合は string.Empty になる
if (!string.IsNullOrWhiteSpace(uri.UserInfo))
{
    // 認証情報が指定されていたらヘッダーを設定
    var bytes = Encoding.UTF8.GetBytes(uri.UserInfo);
    var base64 = Convert.ToBase64String(bytes);
    client.DefaultRequestHeaders.Authorization = new("Basic", base64);
}

var response = await client.GetAsync(uri);  // Basic 認証を潜り抜ける

HttpClientHandler を利用すればリクエスト毎に Authorization ヘッダーを指定したりすることも難しくないでしょう。

まとめ

URL に Basic 認証を含められるようになると、アプリケーション設定の管理も少しばかり簡単になるかもしれませんね。実際僕は実務で役に立ちました :)