MonoでLDAPを使う
概要
Xamarin.iOSで社内システムを構築するにあたり、認証部分(ユーザー管理画面など)を実装するのが面倒なのでOpenDJを立ててLDAPでサクッと済ませたい。
System.DirectoryServices.Protocols
2015年10月時点のMonoでは.NET Framework標準のSystem.DirectoryServicesおよびSystem.DirectoryServices.Protocolsは存在しているが未実装となっているようだ。 MonoベースのXamarin.iOSやXamarin.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 == 49)
{
Console.WriteLine("Invalid Credentials");
}
// その他
else
{
throw;
}
}
}
}
}