سؤال

أنا باستخدام التعليمات البرمجية التالية في Windows Vista Ultimate SP1 الاستعلام لدينا active directory server للتحقق من اسم المستخدم وكلمة المرور المستخدم في المجال.

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 framework 3.5 و جمعت مع VS 2008 القياسية

أنا بتسجيل الدخول تحت حساب مجال هو مجال الادارة حيث يتم تشغيل التطبيق.

الكود يعمل تماما على ويندوز XP.ولكن يمكنني الحصول على استثناء التالية عند تشغيله على ويندوز فيستا:

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 ؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم .net framework 3.5 استخدام هذا الرمز بدلا من ذلك.

لمصادقة المستخدم:

PrincipalContext adContext = new PrincipalContext(ContextType.Domain);

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

إذا كنت بحاجة إلى العثور على المستخدم إلى R/W سمات الكائن تفعل هذا:

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

هذا هو استخدام النظام.DirectoryServices.AccountManagement مساحة لذلك سوف تحتاج إلى إضافة إلى استخدام البيانات.

إذا كنت بحاجة إلى تحويل UserPrincipal كائن إلى DirectoryEntry كائن إلى العمل مع رمز تراث يمكنك القيام بذلك:

DirectoryEntry userDE = (DirectoryEntry)foundUser.GetUnderlyingObject();

نصائح أخرى

وجدت أن نفس رمز تطوف الانترنت على عدة مواقع و لم يعمل بالنسبة لي.ستيف إيفانز هو على الارجح صحيح أنه إذا كنت على .NET framework 3.5 يجب عدم استخدام هذا الرمز.ولكن إذا كنت لا تزال على .NET 2.0 يمكنك أن تجرب هذا المصادقة إلى إعلانك الخدمات:

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

السطر الأول يقوم بإنشاء DirectoryEntry كائن باستخدام المجال واسم المستخدم وكلمة المرور.كما يحدد AuthenticationTypes.لاحظ كيف أضع على حد سواء آمنة (Kerberos) المصادقة SSL باستخدام "المعامل أو" ( '|' ) المشغل بين المعلمات.

السطر الثاني قوات NativeObject من "الدخول" إلى ربط الخدمات الإعلانية باستخدام المعلومات من السطر الأول.

إذا تم طرح استثناء ، ثم التفويض (أو إعدادات) كانت سيئة.إذا كان استثناء ، أنت مصدق.رسالة الاستثناء عادة ما تشير إلى ما حدث من خطأ.

هذا الرمز هو تشبه إلى حد ما لديك بالفعل ، ولكن يستخدم المجال حيث لديك "مسار" ، لم يكن اسم المستخدم جنبا إلى جنب مع المجال.تأكد من تعيين AuthenticationTypes بشكل صحيح أيضا.هذا يمكن أن تجعل كسر او القدرة على المصادقة.

لقد اكتشفت ذلك على أية حال إذا كنت تمر في المجال مع اسم المستخدم على ويندوز فيستا لا تعمل مثل "المجال\المستخدم" حتى يمر فقط "المستخدم" بدلا من ذلك يبدو أن العمل حسنا - ما عدا عليك أن تكون في نفس المجال

لا ربط LDAP تتطلب مرتفعة privs (UAC)?يمكنك محاولة تشغيل Visual Studio و/أو التطبيق كمسؤول وانظر إذا كان ذلك يساعد.إذا كان هذا هو مشكلة يمكن دائما إضافة البيان إلى التطبيق وضعه تتطلب الارتفاع ، بهذه الطريقة سوف يدفع عند مستخدم يعمل عليه.

لست متأكدا لماذا يتطلب مرتفعة privs ، ولكن الأمر يستحق المحاولة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top