34

Windows Vista Ultimate SP1 で次のコードを使用して、Active Directory サーバーにクエリを実行し、ドメイン上のユーザーのユーザー名とパスワードを確認しています。

public Object IsAuthenticated()
{
    String domainAndUsername = strDomain + "\\" + strUser;
    DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, strPass);
    SearchResult result;
    try
    {
        //Bind to the native AdsObject to force authentication.         

        DirectorySearcher search = new DirectorySearcher(entry) { Filter = ("(SAMAccountName=" + strUser + ")") };

        search.PropertiesToLoad.Add("givenName"); // First Name                
        search.PropertiesToLoad.Add("sn"); // Last Name
        search.PropertiesToLoad.Add("cn"); // Last Name

        result = search.FindOne();

        if (null == result)
        {
            return null;
        }

        //Update the new path to the user in the directory.
        _path = result.Path;
        _filterAttribute = (String)result.Properties["cn"][0];
    }
    catch (Exception ex)
    {
        return new Exception("Error authenticating user. " + ex.Message);
    }
    return user;
}

ターゲットは .NET 3.5 を使用しており、VS 2008 標準でコンパイルされています

アプリケーションが実行されているドメイン管理者であるドメイン アカウントでログインしています。

コードは Windows XP で完全に動作します。しかし、Vista で実行すると次の例外が発生します。

System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()

認証タイプを変更しようとしましたが、何が起こっているのかわかりません。


も参照してくださいActive Directory に対してユーザー名とパスワードを検証しますか?

4

4 に答える 4

49

.net 3.5 を使用している場合は、代わりにこのコードを使用してください。

ユーザーを認証するには:

PrincipalContext adContext = new PrincipalContext(ContextType.Domain);

using (adContext)
{
     return adContext.ValidateCredentials(UserName, Password);
}

オブジェクトの属性を読み書きするユーザーを見つける必要がある場合は、次のようにします。

PrincipalContext context = new PrincipalContext(ContextType.Domain);
UserPrincipal foundUser = 
    UserPrincipal.FindByIdentity(context, "jdoe");

これは System.DirectoryServices.AccountManagement 名前空間を使用しているため、using ステートメントに追加する必要があります。

UserPrincipal オブジェクトを DirectoryEntry オブジェクトに変換してレガシー コードを操作する必要がある場合は、次のようにします。

DirectoryEntry userDE = (DirectoryEntry)foundUser.GetUnderlyingObject();
于 2009-01-01T18:20:35.537 に答える
8

同じコードが複数の Web サイトでインターネット上に浮かんでいることがわかりましたが、うまくいきませんでした。.NET 3.5 を使用している場合は、このコードを使用すべきではないという Steve Evans の意見はおそらく正しいでしょう。ただし、まだ .NET 2.0 を使用している場合は、AD サービスに対して認証するためにこれを試すことができます。

DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, 
   userName, password, 
   AuthenticationTypes.Secure | AuthenticationTypes.SecureSocketsLayer);
object nativeObject = entry.NativeObject;

最初の行は、ドメイン、ユーザー名、およびパスワードを使用して DirectoryEntry オブジェクトを作成します。また、AuthenticationTypes も設定します。2 つのパラメーターの間に "Bitwise OR" ( '|' ) 演算子を使用して、セキュア (Kerberos) 認証と SSL の両方を設定していることに注目してください。

2 行目は、1 行目の情報を使用して、"entry" の NativeObject を AD サービスに強制的にバインドします。

例外がスローされた場合は、資格情報 (または設定) が正しくありません。例外がなければ、あなたは認証されています。例外メッセージは通常、何が問題であったかを示します。

このコードは既に持っているものとよく似ていますが、ドメインは「パス」がある場所で使用され、ユーザー名はドメインと結合されていません。AuthenticationTypes も適切に設定してください。これにより、認証機能が成功または失敗する可能性があります。

于 2010-03-26T19:01:02.433 に答える
1

とにかく私はそれを理解しました.vistaでユーザー名を使用してドメインを渡すと、「ドメイン\ユーザー」のようには機能しないため、代わりに「ユーザー」を渡すだけで問題なく機能するようです-同じドメインにいる必要がある場合を除いて

于 2008-12-31T14:50:02.293 に答える
0

LDAP へのバインドには昇格された特権 (UAC) が必要ですか? Visual Studio やアプリを管理者として実行してみて、それが役立つかどうかを確認してください。それが問題である場合は、いつでもアプリケーションにマニフェストを追加して、昇格を要求するように設定できます。そうすれば、ユーザーが実行したときにプロンプ​​トが表示されます。

特権の昇格が必要な理由はわかりませんが、試してみる価値はあります。

于 2008-12-30T17:26:13.417 に答える