メインメニューを開く

差分

MonoでLDAPを使う

3,128 バイト追加, 2015年10月7日 (水) 02:55
ページの作成:「==概要== Xamarin.iOSで開発予定の社内システムを構築するにあたり、認証部分(管理画面など)を実装するのが面倒なのでOpen...」
==概要==
[[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の一覧)に表示されるので追加することで利用できる。
*https://github.com/mono/mono/tree/master/mcs/class/Novell.Directory.Ldap

このライブラリは[[NuGet]]にもあるのでWindows環境でのビルド(環境復元)を考慮すると、こちらを利用した方がいいかもしれない。
*https://www.nuget.org/packages/Novell.Directory.Ldap/

試しに[[OpenDJ]]と繋いでみたが普通に使えている。
詳細はLdapConnectionあたりで[[ググれ]]。
<source lang="csharp">
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;
}
}
}
}
}
</source>

==関連項目==
*[[LDAP]]

==参考文献==
{{reflist}}

{{stub}}

[[category:Mono]]
[[category:Xamarin.iOS]]
[[category:Xamarin.Mac]]
匿名利用者