Basic 認証のあるページにブラウザでアクセスしたことがある方はご存じかと思いますが、以下のような認証情報を入力するダイアログが表示されます。毎度面倒ですよね。
実は、ブラウザなど一部の 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 認証を含められるようになると、アプリケーション設定の管理も少しばかり簡単になるかもしれませんね。実際僕は実務で役に立ちました :)