2012-06-20 2 views
0

Ajax Control Toolkit뿐만 아니라 Active Directory를 처음 사용하는 경우입니다. 내가하려는 것은 사용자가 텍스트 상자에 이름을 입력하기 시작하면 AD에 나열된대로 자동 완성을 시도합니다. AutoCompleteExtender를 사용하여 찾을 수있는 모든 예는 ServicePath의 ASMX 파일을 참조합니다.Active Directory 웹 서비스 및 AutoCompleteExtender

저는 AD 웹 서비스를 프로젝트에 대한 서비스 참조로 추가하는 방법을 알아 냈습니다. 누구나 AutoCompleteExtender에서 내 AD 서비스 참조로 인식하고 재생할 수있는 방법에 대한 지침이나 예를 제공 할 수 있습니까? 심지어 가능할까요?

도움 주셔서 감사합니다.

+0

궁금한 점이 무엇입니까? 사용자가 자신의 사용자 이름 ("사용자가 자신의 이름을 입력하기 시작합니다")을 입력하는 것을 돕는 것처럼 설명합니다. 사용자가 이미 인증 된 경우 이름을 입력 할 필요가 없으며 인증 정보를 통해 검색 할 수 있습니다. 로그온 페이지에서와 같이 사용자가 아직 인증되지 않은 경우이 자동 완성은 인증되지 않은 클라이언트에 중요한 정보 (AD의 모든 이름)를 유출합니다. –

+0

내부 사용자 만 사용할 수 있습니다. 사용자는 자신의 이름뿐 아니라 동료 직원의 이름도 입력하게됩니다. 이미 Outlook을 통해이 정보에 액세스 할 수 있습니다. 나는 단지 그들이 양식을 작성하는 것을 더 쉽게하려고 노력하고있다. – Psykopup

답변

0

올바른 LDAP 경로를 얻기 위해 시스템 관리자로부터 많은 연구와 도움을받은 후 마침내이 작업을 수행하게되었습니다. 나는 다른 사람들이 그것으로부터 이익을 얻을 수 있도록 코드를 게시하고있다. (내가 먼저 .NET 4.0 AJAX 컨트롤 툴킷을 설치합니다.)

을 Default.aspx를 :

<ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True"></ajaxToolkit:ToolkitScriptManager> 
<asp:TextBox ID="txtSearchAD" runat="server"></asp:TextBox> 
<ajaxToolkit:AutoCompleteExtender ServiceMethod="findEmp" 
MinimumPrefixLength="3" 
CompletionInterval="100" 
EnableCaching="true" 
CompletionSetCount="10" 
TargetControlID="txtSearchAD" 
ID="ace1" 
runat="server" 
FirstRowSelected="false" ServicePath="ADS.asmx"> 
</ajaxToolkit:AutoCompleteExtender> 

ADS.asmx.cs :

namespace EventTracking 
{ 
    /// <summary> 
    /// Summary description for ADS 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    [System.Web.Script.Services.ScriptService] 

    public class ADS : System.Web.Services.WebService 
    { 

     [WebMethod] 
     public string[] findEmp(string prefixText, int count) 
     {    
      DirectoryEntry directory = new DirectoryEntry(); 
      directory.Path = "LDAP://DC=yourdomain,DC=com"; //CHANGE to your LDAP path 
      string filter = "(&(cn=" + prefixText + "*))"; 
      string[] strCats = { "cn" }; 
      List<string> items = new List<string>(); 
      DirectorySearcher dirComp = new DirectorySearcher(directory, filter, strCats, SearchScope.Subtree); 
      SearchResultCollection results = dirComp.FindAll(); 
      foreach (SearchResult result in results) 
      { 
       foreach (DictionaryEntry prop in result.Properties) 
       { 
        if (prop.Key.Equals("cn")) 
        { 
         System.Collections.IEnumerable propsEnum = prop.Value as System.Collections.IEnumerable; 
         foreach (object individualValue in propsEnum) 
         { 
          if (individualValue.ToString().IndexOf(prefixText) != 0) 
          { 
           items.Add(individualValue.ToString()); 
          } 
         } 
        } 
       } 
      } 
      return items.ToArray(); 
     } 
    } 
} 

을 즐기십시오!

+0

사이드 노트 ... 광고에서 너무 많은 데이터를 받고 있는데, 서버 이름 등은 필요하지 않았습니다. AD에서 다시 오는 데이터를 필터링해야하는 경우에는 "Organizational Unit"을 다음과 같은 경로 : LDAP : // OU = ADusers, DC = yourdomain, DC = com – Psykopup

+0

prop.Key.Equals ("cn")? 나는 열쇠를 사용할 수 없다 :( – Tarasov