らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

Cisco ACI へログインする C# サンプルプログラム

C# で ACI へログインするサンプルを書いてみました。 ACI 4.2(2e) で検証しましたが、ACI 側のバージョンに依存する部分はありません。 .NET Framework は 4.7.2 を使いました。 サンプルとしての分かりやすさを優先すべく、出来るだけコンパクトに書いていますが、本格的に利用するには以下のような改善が必要だと思います。

  1. 以下をハードコードせず、引数や外部ファイルから指定出来るようにする
    • APIC のアドレス
    • ユーザ名
    • パスワード
  2. 例外処理を追加する
  3. Json をべた書きせず、クラス化する
  4. HttpClient のタイムアウト時間等、必要なパラメータをチューニングする

実際にはレスポンスから token を抜き出し、以降の処理で使います… というアプリケーションを書くことになると思います。

using System;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace HttpPostSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var apic = "10.0.0.1";
            var username = "admin";
            var password = "password";

            var url = "https://" + apic + "/api/aaaLogin.json";
            var json = "{\"aaaUser\":{\"attributes\":{ \"name\":\"" + username + "\",\"pwd\":\"" + password + "\"}}}";

            string responseData = "";
            sendRequest(url, json).ContinueWith(
                (task) =>
                {
                    responseData = task.Result;
                }).Wait();
            Console.WriteLine(responseData);
        }

        static private async Task<string> sendRequest(string url, string json)
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

            var client = new HttpClient();

            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
            request.Content = new StringContent(json, Encoding.UTF8, "application/json");
            var response = await client.SendAsync(request);
            return await response.Content.ReadAsStringAsync();
        }
    }
}