سؤال

لدي تطبيق ويب يعمل ضد مصادقة Windows باستخدام Active Directory الخاص بنا.لدي متطلب جديد لسحب بعض المعلومات الشخصية من خلال إدخال Active Directory.ما هي أسهل طريقة للوصول إلى هذه المعلومات؟

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

المحلول

يبدو أن الوصول إلى المستخدم مباشرة من خلال DirectoryEntry هو الأسلوب الأكثر وضوحًا.فيما يلي بعض الحكايات المتعلقة بالإعلان الذي تعلمته من أول مشروع لي يتعلق بالإعلان:

  • في URI، اكتب LDAP بأحرف صغيرة.وإلا فسوف تحصل على خطأ غامض.قضيت أكثر من يوم في هذه القضية المحبطة..
  • لمسح خاصية ذات قيمة مفردة، قم بتعيينها إلى سلسلة فارغة، وليست خالية.Null يسبب استثناءً.
  • لمسح خاصية متعددة القيم، استخدم DirectoryEntry.Property.Clear() طريقة.
  • سيحدد مرجع مخطط Active Directory نوع البيانات التي ستكون القيمة وما إذا كانت متعددة القيم أو ذات قيمة واحدة.
  • لا تحتاج إلى استخدام RefreshCache() يدويًا على إدخال الدليل، ولكن إذا استخدمته في أي وقت وحددت الخصائص التي سيتم تخزينها مؤقتًا، فاعلم أنه لن يقوم باسترداد أي خصائص أخرى تلقائيًا في المستقبل.
  • يمكن طرح COException في أي وقت تستخدم فيه الفئات الموجودة في System.DirectoryServices.راقب كتل المحاولة تلك.لا تفترض أن أي شيء آمن.

ربما ستحتاج إلى استخدام DirectorySearcher للحصول على إدخال دليل المستخدم الخاص بك إذا كنت لا تعرف مساره (وهو ما لن تعرفه، فقط عن طريق تسجيل دخوله).كان استخدامه سهلاً إلى حد ما ولكن احذر من المراوغات في بناء جملة LDAP؛وهي الحاجة إلى تشفير أحرف غير ASCII (وغيرها؟).من المحتمل أن تكون سلسلة البحث التي ستستخدمها شيئًا مثل: (&(sAMAccountName=whatever)(class=user)).هذا خارج رأسي وقد يكون غير صحيح إلى حد ما.

ال مرجع مخطط Active Directory سيكون مفيدا.افهم أنه يمكن تعديل المخطط وتوسيعه (على سبيل المثال.سيؤدي تثبيت Exchange إلى إضافة معلومات صندوق البريد للمستخدمين).

م اكسبلورر هي أداة مفيدة يمكنك استخدامها لتصحيح الأخطاء وإدارة بيانات AD ذات المستوى المنخفض.لقد وجدت ذلك مفيدًا عندما أعرف الخاصية التي أريد تعيينها ولكن لا يمكنني العثور على مربع الحوار الصحيح في أداة إدارة الإعلانات.

نصائح أخرى

قد تجد المقتطف التالي مفيدًا كبداية.

public static bool IsUserInGroup(string lanid, string group)
{
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
    if(entry != null)
    {
        entry.Username=@"LDAPUSER";
        entry.Password="LDAPPASSWORD";
        DirectorySearcher srch = new DirectorySearcher(entry);
        srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid);
        srch.PropertiesToLoad.Add("memberOf");

        SearchResult result = srch.FindOne();
        if(result != null)
        {
            if(result.Properties.Contains("memberOf"))
            {
                string lookfor = String.Format("cn={0},", group.ToLower());
                foreach(string memberOf in result.Properties["memberOf"])
                {
                    if(memberOf.ToLower().StartsWith(lookfor))
                        return true;
                }
            }
        }
        return false;
    }
    throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}",   lanid, group));
}

ألقِ نظرة على مساحة الاسم System.DirectoryServices:

مساحة الاسم System.DirectoryServices

لقد استخدمت مكتبة LDAP قياسية لاسترداد المعلومات من خادم Active Directory، ولكن يجب عليك التحقق من أن البيانات التي تحتاجها متاحة عبر مخطط خادم LDAP.بشكل عام، يمكنك الحصول على أي معلومات مخزنة في InetOrganizationalPerson ومعظم المعلومات المتعلقة بالمجموعة (المجموعات) التي ينتمون إليها.

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