asp.net 下利用DirectoryEntry验证用户及获取域控制器下的用户结构信息

翻译 2015年11月19日 15:47:18

在企业的众多应用软件中,每个用户对每个软件都需要记住登录的帐号和密码。时间久了,会忘记或搞混。管理人员在用户管理时也需要挨个软件去维护。确实很麻烦。解决的方法是要有统一的用户管理,同一个帐号可以登录多个软件。创建域用户是很好的解决方法。

一、用户的域验证,用户登录软件时,系统先把帐号和密码发送到域服务器进行验证,通过后才能使用软件。

创建 DirectoryEntry对象, 参数:域名(domain) 形如 xxxxx.com,域用户(domainAndUsername)形如 xxxxx.com\user ,域密码(pwd),域用户(user)= 用户登录帐号

C#代码:

               
                DirectoryEntry entry = new DirectoryEntry(string.Format("LDAP://{0}",
                                domain), 
                                domainAndUsername,
                                pwd);
                string r = "ok";
                try
                 {
                  DirectorySearcher search = new DirectorySearcher(entry); //创建DirectoryEntry对象的搜索对象
                  search.Filter = "(SAMAccountName=" +user + ")";  //过滤条件为登录帐号=user
                   SearchResult result = search.FindOne(); //查找第一个
                   if (null == result)   //没找到
                     {
                      r = "cancel";
                     }
                 }
                catch (Exception ex)
                 {
                 r = ex.Message;
                 }
                return r;

                   

二、列举域控制器下的所有用户及组织

本例列举某公司下的组织及用户(组织结构:公司->部门->用户),运行软件的电脑须加入域才能读取域用户信息,如果是web,则发布的服务器也须加入域中。

               
//domain 域名称 user 域上的用户, pwd 域上的用户密码,root 公司名称 ou=root 表示该公司下的组织及用户


  StringBuilder sb = new StringBuilder();
  try
  {	
       DirectoryEntry entry = new DirectoryEntry(string.Format("LDAP://{0}/OU={1},DC={2},DC={3}",
                    domain, root, 
                   domain.Split('.')[0], domain.Split('.')[1]), 
                   domain + @"\" + user, pwd);               
       DirectorySearcher mySearcher = new DirectorySearcher(entry);              
       mySearcher.Filter = ("(objectClass=organizationalUnit)");  // 查找条件是entry 下的部门               
       sb.Append("[{id:'0',pid:null,text:'" + root + "',expand:true}");                
       int i = 1;               
      foreach (SearchResult resEnt in mySearcher.FindAll()) //遍历所有部门                
       {                    
         string _a = resEnt.GetDirectoryEntry().Name.Split('=')[1];                    
         if (_a != root)                   
         {                       
              sb.Append(",{id:'" + i.ToString() + "',pid:'0',text:'" + _a + "'}");                        
              DirectorySearcher m1 = new DirectorySearcher(resEnt.GetDirectoryEntry());  //查找用户对象     
              m1.Filter = ("(objectClass=user)");  //查找条件是所有用户                        
              foreach (SearchResult r1 in m1.FindAll())  //遍历该部门下的所有用户                        
              {                            
               sb.Append(",{
                        id:'" 
                        + r1.GetDirectoryEntry().Properties["sAMAccountName"][0].ToString()
                        + "',pid:'" 
                        + i.ToString() 
                        + "',text:'" 
                        + r1.GetDirectoryEntry().Properties["Name"][0].ToString() 
                        + "'}");
              }
            i++;                  
          }             
     }               
 sb.Append("]");


              

三、把返回的用户信息以树形方式显示在html 上

     
<div id="user" class="gtreeselect"  data-options="{poupuWidth:240,leafNode:true,width:210,onChange:set}" ></div>

              
     
    $(function () {
         jgui.post("/Data/getaduser", { domain: "gxdonta.com", 
            user: "admin", 
            pwd: "123456", 
            root: encodeURIComponent("XXXXXX有限公司") },
          function (text) {
            jgui.get('user').setData(jgui.parseJSON(text));
         });
     }); 

         
jgui的使用查看:https://code.csdn.net/ganyuanmen/jgui

DirectoryEntry的应用

 首先介绍一下命名空间System.DirectoryServices System.DirectoryServices 命名空间用以从托管代码简便地访问 Active Directory。该命名空间...
  • cstester
  • cstester
  • 2009年11月19日 08:53
  • 15215

AD属性对照表[AD域][DirectoryEntry]

AD属性对照表 “常规”标签 姓 Sn  名 Givename  英文缩写 Initials  显示名称 displayName  描述 Description  办公室 p...

DirectoryEntry IIS操作

上面代码都是通过网上资料查找,自己总合到一个类中.这个类对于IIS的增/删/改/查都可以.把代码共享出来,希望对这方面的人有帮助.... 建议使用"Microsoft.Web.Administrati...

C#DirectoryEntry用法

  Path 属性唯一地标识网络环境中的此项。始终可以使用此 Path 检索此项。设置 Path 将从目录存储区检索新项;它不更改当前绑定的项的路径。与 DirectoryEntry 组件关联的类可与...

C# LDAP认证登录

LDAP是轻量目录访问协议基于c#的认证
  • paolei
  • paolei
  • 2013年09月11日 17:28
  • 7766

DirectoryEntry 对象

DirectoryEntry 对象在 System.DirectoryServices 中,目录中的每个对象都由 DirectoryEntry 对象表示。DirectoryEntry 在内存中创建一个...

C# AD(Active Directory)域信息同步,组织单位、用户等信息查询

接上篇 Windows Server 2008 R2 配置AD(Active Directory)域控制器 对AD域结合常见需求用C#进行一些读取信息的操作^_^!   ...

C#域控操作大全_节点删除_修改密码_添加用户

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C...

查看域中所有的用户

前言:我们在添加域用户时,有时会有用户没有添加,或者已添加的用户名拼写错误。 这时,我们想查一下目前域中所有的用户,使用如下命令。 net user /domain   其他一些命令 来源:...
  • sxzlc
  • sxzlc
  • 2013年09月02日 12:12
  • 6553

DirectoryServices中的DirectoryEntry添加用户

 1首先添加引用System.DirectoryServices的.net组件using System.DirectoryServices;2private void adduser(string a...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net 下利用DirectoryEntry验证用户及获取域控制器下的用户结构信息
举报原因:
原因补充:

(最多只允许输入30个字)