【问题标题】:Active Directory Web Service and AutoCompleteExtenderActive Directory Web 服务和 AutoCompleteExtender
【发布时间】:2012-06-20 23:50:39
【问题描述】:

这是我第一次使用 Active Directory 以及 Ajax Control Toolkit。我想要做的是当用户开始在文本框中输入他们的名字时,它会尝试自动完成他们在 AD 中列出的名字。我在使用 AutoCompleteExtender 时可以找到的每个示例,它都引用了 ServicePath 中的一个 ASMX 文件。

我已经设法弄清楚如何将我们的 AD Web 服务作为服务引用添加到我的项目中。 谁能提供有关如何让 AutoCompleteExtender 识别和使用我的 AD 服务参考的任何指导或示例?有没有可能?

感谢您的帮助。

【问题讨论】:

  • 只是好奇,这个有什么用?您将其描述为好像您想帮助用户输入她自己的用户名(“用户开始输入他们的姓名”)。如果用户已经通过认证,则无需输入姓名,可通过认证信息检索。如果用户尚未经过身份验证(如在登录页面上),此自动完成功能会将敏感信息(AD 中的所有名称)泄露给未经身份验证的客户端。
  • 这仅供内部用户使用。用户不仅要输入自己的姓名,还要输入同事的姓名。他们已经可以通过 Outlook 访问这些信息;我只是想让他们更容易填写表格。

标签: asp.net active-directory ajaxcontroltoolkit


【解决方案1】:

经过我们系统管理员的大量研究和帮助以获取正确的 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();
        }
    }
}

享受吧!

【讨论】:

  • 旁注...我从 AD 收到了太多不需要的数据...服务器名称等。如果您需要过滤从 AD 返回的数据,您可以将“组织单位”添加到路径中,如下所示:LDAP://OU=ADusers,DC=yourdomain,DC=com
  • prop.Key.Equals("cn") ?我不能使用密钥:(
猜你喜欢
  • 1970-01-01
  • 2014-05-14
  • 2020-07-02
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-28
  • 2017-09-29
相关资源
最近更新 更多