MonoでLDAPを使う

提供: MonoBook
2016年5月30日 (月) 01:04時点における108.162.226.134 (トーク)による版
ナビゲーションに移動 検索に移動

概要

Xamarin.iOSで社内システムを構築するにあたり、認証部分(ユーザー管理画面など)を実装するのが面倒なのでOpenDJを立ててLDAPでサクッと済ませたい。

System.DirectoryServices.Protocols

2015年10月時点のMonoでは.NET Framework標準のSystem.DirectoryServicesおよびSystem.DirectoryServices.Protocolsは存在しているが未実装となっているようだ。 MonoベースのXamarin.iOSXamarin.Macでも同様に使えない。

Novell.Directory.Ldap

MonoではNovell.Directory.Ldapというライブラリが標準で用意されている。 Xamarin Studioなどでは参照アセンブリの一覧(GACの一覧)に表示されるので追加することで利用できる。

このライブラリはNuGetにもあるのでWindows環境でのビルド(環境復元)を考慮すると、こちらを利用した方がいいかもしれない。

試しにOpenDJと繋いでみたが普通に使えている。 詳細はLdapConnectionあたりでググれ

using System;
using System.Collections.Generic;
using System.Linq;
using Novell.Directory.Ldap;

namespace TestDS
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Auth();
        }

        public static void Auth()
        {
            var username = "monobook";
            var password = "password";
            var basedomain = "dc=ldap,dc=monobook,dc=local";

            try
            {
                // 接続
                var conn = new LdapConnection();
                conn.Connect("localhost", 1389);
                // 認証
                var dn = string.Format("cn={0},{1}", username, basedomain);
                conn.Bind(dn, password);

                // 検索
                var filter = string.Format("cn={0}", username);
                var lsc = conn.Search(basedomain, LdapConnection.SCOPE_ONE, filter, attrs:null, typesOnly:false);

                // 結果取得
                while (lsc.hasMore())
                {
                    var entry = lsc.next();
                    Console.WriteLine("id: " + entry.DN);

                    var attrs = entry.getAttributeSet();
                    foreach (LdapAttribute attr in attrs)
                    {
                        Console.WriteLine("  " + attr.Name + ": " + attr.StringValue);
                    }
                }
            }
            catch (LdapException le)
            {
                // 認証エラー
                if (le.ResultCode == LdapException.INVALID_CREDENTIALS)
                {
                    Console.WriteLine("Invalid Credentials");
                }
                // その他
                else
                {
                    throw;
                }
            }
        }
    }
}

関連項目

参考文献