当前位置: 首页 > news >正文

wordpress jason数据百度seo快速排名优化服务

wordpress jason数据,百度seo快速排名优化服务,全自动在线制作网页,网页设计公司未来三年费用利润前言 嗨,大家好! 在这个数据信息飞速发展的 21 世纪,数据安全成为了每个企业关注的焦点,保护企业数据安全日益成为企业工作中的重中之重。 域服务器,尤其是微软的 Active Directory(AD)&…

Coding-98

前言

嗨,大家好!

在这个数据信息飞速发展的 21 世纪,数据安全成为了每个企业关注的焦点,保护企业数据安全日益成为企业工作中的重中之重。

域服务器,尤其是微软的 Active Directory(AD),因其显著的安全优势,已成为不少企业的首选。

简单来说,域服务器就是一个 “超级管理员”,它可以集中管理网络中的所有用户、计算机和其他资源。

通过域服务器,企业可以轻松地为用户分配和管理权限,确保数据安全;也可以通过组策略,统一管理网络中所有计算机的设置和安全策略,更好地保护敏感信息。

域服务器天然就是一个企业员工信息的数据库,将业务系统的身份鉴权跟域服务器紧密结合,无疑已经成为安全技术发展的趋势。

C# 拥有丰富的类库来与 Active Directory(AD)互动,但使用时很不方便,因此我根据项目的实际业务需求,造了一个轮子,封装了一些常用的操作 AD 的方法,简化了与 AD 的交互,用起来还挺方便的。

今天,我很高兴与大家分享这些便利,希望能让你的开发之旅充满乐趣和效率!

下面,让我们一起来看看具体的实现步骤吧!

Step By Step 代码

1. 创建配置文件

首先,需要创建一个配置文件如 LDAPConfig.config,用于保存域的相关配置信息,内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<LDAPConfiguration><Host><URL>192.168.0.120:389</URL><LoginDN>CN=corp_test,CN=Users,DC=jacky,DC=com</LoginDN><Password>+6nkUhDs5lmcfMYS/qe7Qw==</Password></Host><UserSearch><SearchBase>OU=某某市软件技术有限公司,DC=corp,DC=com</SearchBase><SearchFilter>(&amp;(objectClass=Person)(sAMAccountName={0}))</SearchFilter><UserAttribute>sAMAccountName,memberOf,displayName</UserAttribute></UserSearch><AdminGroup>AndoErp_Administrators</AdminGroup>
</LDAPConfiguration>
2. 创建配置文件实体类

接下来,创建一个配置文件实体类 LDAPConfigModel,读取和解析配置文件中的信息,留意注释

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using Common.Util;namespace Common.Model
{[XmlRoot("LDAPConfiguration")]public class LDAPConfigModel{/// <summary>/// AD/LDAP 服务器和绑定帐号配置/// </summary>[XmlElement("Host")]public LdapHostSetting LdapHost { get; set; }/// <summary>/// 用户搜索配置/// </summary>[XmlElement("UserSearch")]public UserSearchSetting UserSearch { get; set; }/// <summary>/// 管理员组/// </summary>public string AdminGroup { get; set; }}public class LdapHostSetting{/// <summary>/// AD/LDAP 服务器 URL/// </summary>public string URL { get; set; }/// <summary>/// 绑定帐号的 distinguished name/// </summary>public string LoginDN { get; set; }/// <summary>/// 绑定帐号的密码(加密状态)/// </summary>public string Password { get; set; }/// <summary>/// 绑定帐号的密码/// </summary>[XmlIgnore]public string SafePassword{get { return EncryptUtil.AESDecode(Password); }set { Password = EncryptUtil.AESEncode(value); }}}public class UserSearchSetting{/// <summary>/// 搜索路径/// </summary>public string SearchBase { get; set; }/// <summary>/// 搜索过滤器/// </summary>public string SearchFilter { get; set; }/// <summary>/// 搜索属性/// </summary>public string UserAttribute { get; set; }}
}
3. 创建一个域常用操作方法的封装类

然后,创建一个名为 LdapUtil 的静态类,封装所有与域相关的操作方法,重点:留意代码注释

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.DirectoryServices.Protocols;
using Common.Model;
using System.Net;
using Ando.ERP.Logger;
using System.IO;
using System.Reflection;namespace Common.Util
{/// <summary>/// 域 LDAP/AD 常用操作方法封装类/// </summary>public static class LdapUtil{static readonly LDAPConfigModel ldapConfig = null;/// <summary>/// 静态构造方法,读取配置文件,初始化 ldapConfig 对象/// </summary>static LdapUtil(){if (ldapConfig != null) return;string ldapConfigPath;if (AppDomain.CurrentDomain.SetupInformation.PrivateBinPath != null)ldapConfigPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath, "ConfigFile", "LDAPConfig.config");elseldapConfigPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ConfigFile", "LDAPConfig.config");if (!File.Exists(ldapConfigPath)){Assembly myAssembly = Assembly.GetExecutingAssembly();FileInfo dllFile = new FileInfo(myAssembly.Location);string path = dllFile.Directory.FullName;ldapConfigPath = Path.Combine(path, "ConfigFile", "LDAPConfig.config");}ldapConfig = ConfigUtil.Deserialize<LDAPConfigModel>(ldapConfigPath);}#region common private method/// <summary>/// 连接域服务器/// </summary>/// <param name="loginDN">域用户</param>/// <param name="loginPassword">域用户密码</param>/// <param name="ldapConnection">LdapConnection 对象</param>private static void Connect(string loginDN, string loginPassword, ref LdapConnection ldapConnection){var networkCredential = new NetworkCredential(loginDN, loginPassword);ldapConnection.SessionOptions.SecureSocketLayer = false;ldapConnection.SessionOptions.ProtocolVersion = 3;ldapConnection.AuthType = AuthType.Basic;ldapConnection.Credential = networkCredential;ldapConnection.Bind();}/// <summary>/// <para>通过 LDAP 配置信息连接域服务器</para>/// <para>如果参数 cLoginDN 不为空,使用 cLoginDN 作为 loginDN</para>/// <para>如果参数 cLoginPassword 不为空,使用 cLoginPassword 作为 loginPassword</para>/// </summary>/// <param name="ldapConfig"></param>/// <param name="ldapConnection"></param>/// <param name="cLoginDN"></param>/// <param name="cLoginPassword"></param>private static void Connect(ref LdapConnection ldapConnection, string cLoginDN = "", string cLoginPassword = ""){string loginDN = string.IsNullOrEmpty(cLoginDN) ? ldapConfig.LdapHost.LoginDN : cLoginDN;string loginPassword = string.IsNullOrEmpty(cLoginPassword) ? ldapConfig.LdapHost.SafePassword : cLoginPassword;AndoErpLogger.DEFAULT.DebugFormat("Connecting to LDAP/AD server [{0}] with account [{1}]", ldapConfig.LdapHost.URL, loginDN);Connect(loginDN, loginPassword, ref ldapConnection);}/// <summary>/// 通过 Action 执行一些自定义操作,LDAP Util 核心方法/// </summary>/// <param name="ldapConfig"></param>/// <param name="cLoginDN"></param>/// <param name="cLoginPassword"></param>/// <param name="func"></param>private static void LDAPCore(string cLoginDN, string cLoginPassword, Action<LdapConnection> action){LdapConnection ldapConnection = null;try{ldapConnection = new LdapConnection(ldapConfig.LdapHost.URL);Connect(ref ldapConnection, cLoginDN, cLoginPassword);action(ldapConnection);}catch{throw;}finally{if (ldapConnection != null) ldapConnection.Dispose();}}/// <summary>/// 通过用户搜索配置搜索域数据/// </summary>/// <param name="ldapConnection"></param>/// <param name="sizeLimit">指定返回的实体数</param>/// <param name="searchPath">搜索路径</param>/// <param name="filter">过滤字符串</param>/// <param name="isSubtree">是否深度搜索</param>/// <param name="attrs">搜索属性</param>private static SearchResultEntryCollection Search(LdapConnection ldapConnection, int sizeLimit, string searchPath, string filter, params string[] attrs){try{SearchRequest request = new SearchRequest(searchPath, filter, SearchScope.Subtree, attrs);if (sizeLimit > 0) request.SizeLimit = sizeLimit;SearchResponse response = (SearchResponse)ldapConnection.SendRequest(request);return response.Entries;}catch (DirectoryOperationException e){// 返回此异常中已处理的所有数据// 因为 LDAP/AD 搜索默认在 1000 以内,超过就会报这个错SearchResponse response = (SearchResponse)e.Response;return response.Entries;}catch (Exception ex){throw;}}#endregion#region business method/// <summary>/// 获取指定域用户的 distinguished name 值/// </summary>/// <param name="ldapConfig"></param>/// <param name="userName"></param>/// <returns></returns>private static LdpaUserInfo GetLDAPUserDN(string userName){var ldpaUser = new LdpaUserInfo();LDAPCore(null, null, (ldapConnection) =>{var userEntries = GetUserEntries(ldapConnection, userName, 50);var userEntry = userEntries[0];ldpaUser.UserDN = userEntry.DistinguishedName;ldpaUser.UserGroupList = GetAttributeValues(userEntry, "memberOf");ldpaUser.UserDisplayName = GetAttributeValues(userEntry, "displayName")[0];});return ldpaUser;}/// <summary>/// 获取用户搜索配置中的所有域帐户实体/// </summary>/// <param name="ldapConfig"></param>/// <param name="ldapConnection"></param>/// <param name="userName"></param>/// <param name="sizeLimit"></param>/// <returns></returns>private static SearchResultEntryCollection GetUserEntries(LdapConnection ldapConnection, string userName, int sizeLimit){string userSearchBasePath = ldapConfig.UserSearch.SearchBase;string userSearchFilter = ldapConfig.UserSearch.SearchFilter;string[] userAttribute = ldapConfig.UserSearch.UserAttribute.Split(',');if (!string.IsNullOrEmpty(userName)){userSearchFilter = string.Format(userSearchFilter, userName);}var userEntries = Search(ldapConnection, sizeLimit, userSearchBasePath, userSearchFilter, userAttribute);if (userEntries == null || userEntries.Count == 0){string exceptionMsg = string.Format("没有找到符合条件的域用户,请检查用户搜索配置。搜索路径: [{0}], 过滤条件: [{1}]", userSearchBasePath, userSearchFilter);throw new LdapException(exceptionMsg);}return userEntries;}/// <summary>/// 获取域帐户实体配置中的属性的值/// </summary>/// <param name="entry"></param>/// <param name="attributeName"></param>/// <returns></returns>private static List<string> GetAttributeValues(SearchResultEntry entry, string attributeName){var attributes = entry.Attributes;var attributeObj = attributes[attributeName];if (attributeObj == null){return null;}List<string> valueList = new List<string>();   var attributeValues = attributes[attributeName].GetValues(typeof(string));foreach (var attributeValue in attributeValues){valueList.Add(CommonUtil.TranNull<string>(attributeValue));}return valueList;}/// <summary>/// 检查登录帐户是否存在域中/// </summary>/// <param name="userName"></param>/// <param name="password"></param>/// <param name="ldapConfig"></param>/// <returns></returns>public static bool IsExistLDAPUser(string userName, string password, out bool isAdministrator, out string userDisplayName){bool result = false;bool userIsAdmin = false;string userShowName = string.Empty;try{var ldpaUser = GetLDAPUserDN(userName);string userDN = ldpaUser.UserDN;userShowName = ldpaUser.UserDisplayName;LDAPCore(userDN, password, (ldapConnection) =>{if (ldpaUser.UserGroupList == null || ldpaUser.UserGroupList.Count == 0)userIsAdmin = false;else{var findResult = ldpaUser.UserGroupList.First(x => x.IndexOf(ldapConfig.AdminGroup, StringComparison.OrdinalIgnoreCase) > 0);if (string.IsNullOrEmpty(findResult))userIsAdmin = false;elseuserIsAdmin = true;}result = true;});}catch (Exception ex){// TODO 可将错误信息写到日志中,方便排查原因result = false;}isAdministrator = userIsAdmin;userDisplayName = userShowName;return result;}/// <summary>/// 获取用户搜索配置中的所有域帐户的 displayName 的值/// </summary>/// <param name="ldapConfig"></param>/// <param name="userName"></param>/// <returns></returns>public static List<string> GetAllUsers(){var list = new List<string>();LDAPCore(null, null, (ldapConnection) =>{var userEntries = GetUserEntries(ldapConnection, "*", 350);foreach (var userEntry in userEntries){var userDisplayName = GetAttributeValues((SearchResultEntry)userEntry, "displayName")[0];list.Add(userDisplayName);}});return list;}#endregion#region Inner class/// <summary>/// 域用户基本信息/// </summary>sealed class LdpaUserInfo{public string UserDN { get; set; }public List<string> UserGroupList { get; set; }public string UserDisplayName { get; set; }}#endregion}
}
4. 使用示例

最后,我们来看一下如何使用这个封装类来执行一些基本操作,比如登录

/// <summary>
/// 登录
/// </summary>
/// <param name="userName"></param>
/// <param name="password"></param>
/// <returns></returns>
public void Login(string userName, string password)
{var hasUser = LdapUtil.IsExistLDAPUser(userName, password, out bool isAdministrator, out string userDisplayName);if (hasUser){// 域用户存在,登录成功,继续处理后续业务}else{// 域用户不存在,登录失败}
}

总结

好了,今天的分享就到这里啦!

通过以上的封装,我们可以更高效地与 Active Directory 进行交互,无论是用户的身份验证、信息查询,还是其他操作,这些方法都能帮助简化代码,提高开发效率,你可以把它用在自己的项目里,根据自己的实际业务需求,继续添加新的业务处理方法或删减其中一些方法!

随着数字化进程的加速,越来越多的企业转向域服务器来高效管理网络环境,C# 的灵活性和强大功能使其与 Active Directory 的结合成为了一种自然的选择,希望这篇教程能够给你提供一些实用的操作方法和思路。

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  2. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号,更多干货等着你!

http://www.khdw.cn/news/34244.html

相关文章:

  • 网站导航仿站自媒体账号申请
  • 做网站包括什么软件网络营销的手段有哪些
  • 外贸网站自我建设与优化电商平台怎么做
  • 1000学习做网站贵吗抖音优化
  • 织梦网站模板后台密码找回31省市新增疫情最新消息
  • 最准做特马网站百度提问首页
  • 怎样创建自己公司网站腾讯竞价广告
  • 辽宁省工程造价管理总站小红书软文案例
  • 苹果cms做网站国外友链买卖平台
  • 做网站图片软件淘宝seo是什么意思
  • 延庆网站建设有没有自动排名的软件
  • 免费企业网站建站百度上怎么发布信息啊
  • 这几年做网站怎么样百度账号批发网
  • 做360网站中保存的图片存在哪里的公司seo排名优化
  • 小白怎么做网站搬家教程游戏广告联盟平台
  • 南通模板网建站网络seo推广
  • 如何做网站推微信营销平台系统
  • 武汉网站程序外包英文网站seo
  • jsp网站服务器如何做防护百度域名注册查询
  • 网站关键词用什么隔开软文编辑器
  • 网站高质量链群怎么做长沙关键词优化方法
  • 网站建设心得.doc宝鸡seo优化公司
  • 外贸网站推广平台蓝颜seo牛网络营销和推广做什么
  • 百度站长电脑版市场营销毕业论文5000字
  • 只做原创内容平台网站百度网页广告怎么做
  • 网站制作学什么软件有哪些推广页面制作
  • 杭州品牌网站开发b站入口2024已更新
  • 简单电商网站模板淮北seo排名
  • 郑州专业网站制作服务费用怎样制作一个自己的网站
  • 河南seo网站开发百度推广关键词规划师