2009-04-20 7 views
10

ディレクトリサービスを使用するWindowsオペレーティングシステムで、自分のアプリケーションのユーザー名とパスワードを認証したいと考えています。たとえば、Microsoft Active Directory、Novell eDirecotry、またはSunOneなどです。私はすでにC#でMicrosoft Active Direcotryのためにネイティブにこのコードを実行する方法を知っています。 (私は完全にADSIを使用して低レベルのCOMコンポーネントを作成しました).NETでLDAPを認証する方法

ノベルのeDirecotoryで認証しようとする方法は、私はMonoプロジェクトをインストールしています。モノプロジェクトの中でNovell.Directory.ldap.dllを提供しています。コードはMicrosoft Active Directoryの場合と同じです(http://www.novell.com/coolsolutions/feature/11204.html

SunOneの場合、私はアクティブディレクトリと同じコードを使用するよう指示されています。しかし、LDAPのconnecton文字列は少し異なっている(http://forums.asp.net/t/354314.aspx) (http://technet.microsoft.com/en-us/library/cc720649.aspx

私のプロジェクトを複雑にするには、ほとんどの顧客は、「サービスアカウント:」を使用。私ができる前に、私は管理者のユーザー名とパスワードでバインドする必要があることを意味通常のユーザー名とパスワードを認証します。私の質問は2つの部分に分かれています。

1)私が上で説明したことから、これは、個々のディレクトリサービスに対して認証するべき正しい方向ですか?

2)私はこのコードを一切行う必要はないと感じています。私はまた、サービスアカウントを使用するという規定はまったく重要ではないと感じています。私が心配しているのは、Windowsマシン上でユーザー名とパスワードを認証することだけですが、なぜLDAPを使用する必要があるのでしょうか?私はそれについて考えるのです。午前中にマシンにログインすると、ログインするだけでサービスアカウントを提供する必要はありません。私は簡単にrunas機能を使用してDOSプロンプトでユーザー名とパスワードを認証することができます。私は拒否され、テキストファイルを解析することができます。確かに私はあなたのユーザー名とパスワードがWindows上で動作しているドメインに対して有効であるかどうかを教えてくれるWindowsオペレーティングシステムにユーザー名とパスワードを渡すことができます。私は正しい?もしそうなら、どんな提案方法がありますか?

マイケルEvanchik www.MikeEvanchik.com

答えて

3

これはすべてSystem.DirectoryServices.Protocolsで行うことができます。ディレクトリへのLdapConnectionを作成する場合は、サービスアカウントを使用してバインドしてから、後続のバインドを実行して資格情報を認証することができます。

サービスアカウントは、通常、サーバーの認証メカニズムへのアクセスを制限するために使用されます。この方法では、通りにいる人があなたのLDAPサーバーを認証しようとすることはできません。

また、ログイン時に各ユーザーが識別名を提供することを期待していますか? Active Directoryでは、sAMAccountNameだけが必要ですが、eDirectoryやSunONEなどの他のプロバイダでは、認証に識別名が必要です。

このタイプの認証を実行するには、提供されているサービスアカウントを使用してサーバーを認証し、指定されたユーザー名でユーザーを検索し、そのユーザーの識別名を取得する必要があります。その識別名と提供されたパスワードを使用して認証できます。

これは、すべてのLDAPシステムで機能しますが、Active DirectoryはsAMAccountNameだけに満足します。

11

私は完全に質問を理解していないが、私が見つけたいくつかの状況では、それは簡単に、単純に自分のアカウントの検索を行うことによって、ユーザを認証し、その資格情報をユーザー名とパスワードとして使用します。

クエリが成功した場合は、提供されたすべてが正しいことを意味し、アカウントを見つけられなかったということは何かが間違っていたことを意味します。

//use the users credentials for the query 
DirectoryEntry root = new DirectoryEntry(
    "LDAP://dc=domain,dc=com", 
    loginUser, 
    loginPassword 
    ); 

//query for the username provided 
DirectorySearcher searcher = new DirectorySearcher(
    root, 
    "(sAMAccountName=" + loginUser + ")" 
    );  

//a success means the password was right 
bool success = false; 
try { 
    searcher.FindOne(); 
    success = true; 
} 
catch { 
    success = false; 
} 

おそらくない「ベスト・プラクティス」が、あなたが持っているあなたの問題を回避するかもしれない...

+0

上記の前提は、Microsoft ADのみであり、LDAPを使用しています。コードをありがとう。私の質問は普遍的な方法であり、おそらくLDAPを使用しない場合があります。これは、LDAPサーバーの中にはサービスアカウントのユーザー名とパスワードが必要なためバインドするだけなので、正規ユーザーの認証を試みることさえできます。 –

+0

これは私が提案しているのですが、ログインしたユーザーの資格情報(ユーザー名とパスワードを要求していると仮定して)をサービスアカウントとして使用します。少なくとも、自分のアカウントを照会して見ることができるはずです。それが動作すれば、認証が機能することがわかります。それは、パスワードが正しいかどうかを確認するためのかなり普遍的な方法のようです。 – Hugoware

0

私たちは、ドメインの資格情報に対するユーザ名とパスワードを認証するために必要なウェブサイトを持っていたとのLogonUser APIを使用関数。ネットワークログオンに使用します(引数の1つがログオンタイプです)、それは資格情報を検証するだけで、runasが行うユーザープロファイルを読み込むようなことはしません。 サービスアカウントでLogonUserを呼び出すのに十分なアクセスが必要であることに注意してください。 OSごとに異なるため、MSDNのドキュメントでそのアクセス権を確認することをお勧めします。

+0

私に正しい道を導いてくれてありがとう。あなたの権利は、あなたがこれを必要としないapi呼び出しがあると言うこのスレッドを読んでいるなら、このapiコールを行うためにローカル管理者が必要ですが、グーグルが何かを探せば http://www.vbforums.com/showthread .php?t = 240277 with AcquireCredentialsHandleNT with security.dll –

+0

2003年の場合、LogonUserにはSE_TCB_NAMEは必要ありません。私はAcquireCredentialsHandleを呼び出すだけで、それらが有効であることを確認するとは思わない。このコードは、完全なクライアント/サーバー認証チェックをシミュレートしています。明白なコードのロード以外は何も間違っているとは見えません。 – pipTheGeek