C# -- Novell.Directory.Ldap连接LDAP作简单筛选查询,并处理objectGUID的乱码问题

这篇具有很好参考价值的文章主要介绍了C# -- Novell.Directory.Ldap连接LDAP作简单筛选查询,并处理objectGUID的乱码问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是LDAP

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,LDAP是从X.500目录访问协议的基础上发展过来的,目前的版本是v3.0。与LDAP一样提供类似的目录服务软件还有ApacheDS、Active Directory、Red Hat Directory Service 。

LDAP的特点

LDAP作为一个是轻量目录服务软件,与关系型数据库不同,它有很好的读性能,当读写比大于7:1的时候,就可以考虑使用LDAP存储数据。但是写性能很差,所以不擅长处理频繁的修改的插入,并且没有事务处理、和回滚等功能。

LDAP提供静态数据的快速查询方式

Client/Server模型,Server 用于存储数据,Client提供操作目录信息树的工具

这些工具可以将数据库的内容以文本格式(LDAP 数据交换格式,LDIF)呈现在您的面前

LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议

一般会将认证用户信息放在LDAP中,例如单位人员的信息,按照单位部门层级创建目录,并将人员信息存放在相应的目录下。但是因为目录服务不是像关系型数据库的表格结构,所以查询时不能使用SQL语句。

C#链接LDAP

本文中采用的是使用开源工具 Novell.Directory.Ldap ,可以在 Nuget 中下载包使用

还有一种比较简单的连接方式,安装使用 System.DirectoryServices 包,使用方法可以自行百度。
DirectoryServices 有一个优点,其读取并显示出的信息和 LDAP 中是一样的,基本不需要额外的转化操作。
比如 LDAP 中的 objectGUID一般是以 octetString 类型存储的,我们从 DirectoryEntry 中的 Properties 中获取的 objectGUID 和 LDAP 中的 objectGUID 是一致的,不存在乱码的情况
但是 Novell.Directory.Ldap 中读取的 obejctGUID 的 StringValue 会存在乱码的情况,但是其实际值是正确的,我们可以根据它返回的 ByteValue 自行解析

那么为什么不使用 DirectorySearcher呢?因为它不支持 LINUX 平台。

代码

在这做一个简单的接口

        private string Domin = "aaa";//域名称
        private string Host = "aaa.bb.cc";//域服务器地址
        private int Port = 389;///端口
        private string BaseDc = "DC=aaa,DC=bb,DC=cc";//根据上面的与服务器地址 拆分DC
        private string User = "xxxxxx";//用户名
        private string Password = "xxx";//密码
        
        /// <summary>
        /// 获取用户信息
        /// </summary>
        /// <param name="user">用户信息</param>
        /// <returns>用户结果集</returns>
        [HttpGet]
        public Dictionary<string,object> GetUserByName(User user)
        {
            Dictionary<string, object> rs = new Dictionary<string, object>();

			//用户结果集
            List<User> result = new List<User>();
            
            //默认响应结果
            rs.Add("code", 500);
            rs.Add("msg", "接口异常"); 
            rs.Add("data", result);
            rs.Add("success", false);

            if (null != user)
            {
                try
                {
                    //初始化链接
                    using (var ldapConnection = new LdapConnection())
                    {
                        //链接
                        ldapConnection.Connect(Host, Port);

						//使用指定的认证信息发送 LDAP 绑定。
                        ldapConnection.Bind(Domin + "\\" + User, Password);
                        
                        //过滤条件
                        string filter = "(&(objectClass=user)";
                        if (null != user.realname && !"".Equals(user.realname))
                        {
                            filter += "(name=*" + user.realname + "*)";
                        }
                        if (null != user.email && !"".Equals(user.email))
                        {
                            filter += "(mail=*" + user.email + "*)";
                        }
                        filter += ")";

	                    //设置查询条件 在这里我们只要返回 用户 guid、name、mail就可以了
                        var entities = ldapConnection.Search(BaseDc, LdapConnection.ScopeSub,filter,new string[] { "objectGUID","name","mail"}, false);
                        
                        //循环结果集
                        while (entities.HasMore())
                        {
                            try
                            {
                                LdapEntry entity = entities.Next();
                                User useri = new User();
                                foreach (var item in entity.GetAttributeSet()) {
                                    if ("name"==item.Name)
                                    {
                                        useri.realname = item.StringValue;
                                    }
                                    else if("mail"==item.Name)
                                    {
                                        useri.email = item.StringValue;
                                    }
                                    else if ("objectGUID"==item.Name)
                                    {
                                    	//处理objectGUID乱码
                                        string guid = OctetStringToString(item.ByteValue) ;
                                        useri.id = guid;
                                    }
                                }
                                result.Add(useri);
                            }
                            catch (Exception ex)
                            {
                            }
                        }

                        rs["code"] = 200;
                        rs["msg"] = "";
                        rs["data"] = result;
                        rs["success"] = true;
                    }
                }
                catch (Exception err)
                {
                    rs["msg"] = err.Message;
                }
            }
            return rs;
        }

        /// <summary>
        /// 网上找的方法
        /// 解析拼接 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx
        /// </summary>
        /// <param name="GUID"></param>
        /// <returns></returns>
        private string OctetStringToString(byte[] GUID)
        {
            String strGUID = "";
            String byteGUID = "";

            for (int c = 0; c < GUID.Length; c++)
            {
                byteGUID = byteGUID + "\\" + AddLeadingZero((int)GUID[c] & 0xFF);
            }
            strGUID = "";
            strGUID = strGUID + AddLeadingZero((int)GUID[3] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[2] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[1] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[0] & 0xFF);
            strGUID = strGUID + "-";
            strGUID = strGUID + AddLeadingZero((int)GUID[5] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[4] & 0xFF);
            strGUID = strGUID + "-";
            strGUID = strGUID + AddLeadingZero((int)GUID[7] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[6] & 0xFF);
            strGUID = strGUID + "-";
            strGUID = strGUID + AddLeadingZero((int)GUID[8] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[9] & 0xFF);
            strGUID = strGUID + "-";
            strGUID = strGUID + AddLeadingZero((int)GUID[10] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[11] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[12] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[13] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[14] & 0xFF);
            strGUID = strGUID + AddLeadingZero((int)GUID[15] & 0xFF);
            
            return strGUID;
        }

        /// <summary>
        /// 长度不足补零
        /// </summary>
        /// <param name="k"></param>
        /// <returns></returns>
        private static String AddLeadingZero(int k)
        {
            return (k <= 0xF)?"0"+Int2String(k): Int2String(k);
        }

        /// <summary>
        /// int 转 hexstring
        /// </summary>
        /// <param name="kb"></param>
        /// <returns></returns>
        private static string Int2String(int kb)
        {
            byte[] bytes = new byte[1];
            bytes[0] = (byte)(kb & 0xFF);
            string S = Convert.ToHexString(bytes);
            return S;
        }

Linux 安装.NetCore环境

因为我使用的是内网服务器,这里主要记录一下离线环境的配置,在线安装直接使用 yum instyall 安装各种环境即可

  • 下载安装包 ,我选择的是 .NET 6.0.101 ,X64版本

https://dotnet.microsoft.com/en-us/download/dotnet/6.0

  • LINUX 服务器创建文件夹

mkdir /home/dotnet

  • 上传文件到创建的文件夹里面
  • 解压文件

tar zxvf dotnet-sdk-6.0.101-linux-x64.tar.gz

  • 创建软连接

ln -s /home/dotnet/dotnet /usr/bin

  • 测试dotnet环境

dotnet --version
正常打印dotnet版本即表示安装成功。

.NetCore WebApi 部署

  • 发布项目 打包到 myproject 文件夹
  • 上传服务器 /home/dotnet_project 文件夹下
  • 执行命令

dotnet /home/dotnet_project/myproject/myWebApi.dll
添加参数 --urls = http://0.0.0.0:8800 指定端口(可以在appSetting.json中配置 urls )

  • 测试端口

curl http://127.0.0.1:8800/api/Ldap/get
curl -X POST --header “Content-Type: application/json” -d {“name”:“小明”} http://127.0.0.1:8800/api/Ldap/getUserByName文章来源地址https://www.toymoban.com/news/detail-441405.html

到了这里,关于C# -- Novell.Directory.Ldap连接LDAP作简单筛选查询,并处理objectGUID的乱码问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LDAP简介

    LDAP简介: LDAP是LightWeight Directory Access Protocol的简称,是一种轻量目录访问协议。 它是基于X.500标准的,可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAP man RFC网页中找到。 简单来说,LDAP是

    2024年02月14日
    浏览(36)
  • springboot集成Ldap

    一、什么是Ldap 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。 二、为什么需要Ldap 这里举个例子,一个公司内部有很多系统,每个系统都

    2024年02月14日
    浏览(31)
  • LDAP协议

    LDAP LDAP基础 LDAP应用特性 全局编录服务器 LDAP定义

    2024年02月11日
    浏览(36)
  • 从0开始的LDAP注入

    ① - 参考 LDAP概念和原理介绍 - WilburXu - 博客园 (cnblogs.com) LDAP注入入门学习指南 - 云+社区 - 腾讯云 (tencent.com) LDAP注入与防御剖析 - r00tgrok (wooyun.js.org) LDAP概念和原理 (qq.com) ② - 介绍 目录 :目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目

    2024年02月07日
    浏览(48)
  • OSCP-Hutch(ldap)

    2024年02月05日
    浏览(28)
  • 极狐GitLab 如何配置多个 LDAP?

    本文仅适用于极狐GitLab私有化部署场景。 极狐GitLab 的多 LDAP 接入功能解决了企业在以下场景中可能遇到的痛点: 多个组织/部门的整合 :在大型企业或跨国公司中,往往存在多个组织或部门,它们可能拥有独立的 LDAP 服务器。GitLab 的多 LDAP 接入功能允许这些组织或部门在一

    2024年02月21日
    浏览(49)
  • 安全运营 ldap监控域控信息

    公司有多个主域,子域,有的子域因为境外数据安全的问题无法把日志传输到境内。那么如何在没有日志的情况下监控子域或者互信域的组织单元(OU)信息呢。 由于访问互信域要在域控上进行,本文根据最小权限原则监控普通用户也可以访问的子域。 我想到通过ldap查询来获取

    2024年02月06日
    浏览(61)
  • LDAP搭建,实现linux账号统一管理

    ldap是开源的轻量级目录访问协议,英文全称是Lightweight Directory Access Protocol,它本身是一个小型文件数据库,能够通过server + client(服务端+客户端)的方式,进行统一的用户账号管理。随着公司研发人员越来越多,在各个研发服务器上添加重复账号就变得麻烦,如果使用ldap来管

    2024年02月04日
    浏览(39)
  • SpringBoot整合Ldap--超详细方法讲解

    LDAP(轻量目录访问协议)是一种用于访问和维护分布式目录信息服务的协议。目录服务是一种存储和检索信息的服务,通常用于存储组织内的用户信息、组织结构、网络设备等数据。LDAP是一种轻量级的协议,设计用于在目录中进行查找和修改操作,而不是用于传输大量的数

    2024年02月05日
    浏览(35)
  • hadoop安全保护机制(kerberos + ldap)

    CIA模型: 机密性、完整性和可用性   CIA模型能够帮助建议一些信息安全原则,但该模型并不是一个需要严格遵守的规则   hadoop平台可能设计多个CIA模型组件,也kennel一个也不涉及    信息只应该被期望的接收者看到    身份标识:唯一标识消息传递者    身份验证:证明自

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包