A-A+

.NET与AD-与站点结合(一)

2014年08月23日 技术 暂无评论 阅读 2,530 次

索引请点击这里

假设现在有一个需求:将AD中的人员名称定时同步至某个站点的数据库内,该站点非匿名访问,登录时需要进行域验证。

针对这个需求,需要至少一张数据库表(在此命名为TB_UserInfo),表结构设计如下:

字段名称 类型 备注
UserID varchar 主键,用户ID,与AD中user的ID属性相同
UserName varchar 用户名称,与AD中user的sAMAccountName属性相同
DisplayName Varchar 用户显示名称,与AD中user的DisplayName属性相同

同步程序设计如下:

  1. 使用Windows Service或者桌面应用程序开发,安装至服务器后设置为开机自启动。
  2. 假设数据量在千条之内,则将AD中指定节点下的人员数据和数据库中表TB_UserInfo中的数据读取至内存集合(ADUserCollection和DBUserCollection)中,在数据库中更新属于ADUserCollectio且属于DBUserCollection的数据;在数据库中删除属于DBUserCollection但不属于ADUserCollection的数据;在数据库中新增属于ADUserCollection但不属于DBUserCollection的数据。

示例代码如下:

  1. /// <summary>
  2. /// 人员信息
  3. /// </summary>
  4. public class UserInfo
  5. {
  6.         /// <summary>
  7.         /// 人员ID
  8.         /// </summary>
  9.         public string UserID  {  get ; set; }
  10.         /// <summary>
  11.         /// 用户名
  12.         /// </summary>
  13.         public string UserName  {  getset; }
  14.         /// <summary>
  15.         /// 显示名称
  16.         /// </summary>
  17.         public string DisplayName  {  getset; }
  18. }
  19. /// <summary>
  20. /// 为UserInfo自定义的比较类
  21. /// </summary>
  22. public class UserInfoComparer : IEqualityComparer<UserInfo>
  23. {
  24.         public bool Equals(UserInfo x, UserInfo y)
  25.         {
  26.                 return x.UserID == y.UserID;
  27.         }
  28.         public int GetHashCode(UserInfo userInfo)
  29.         {
  30.                 return userInfo.UserID.GetHashCode();
  31.         }
  32. }
  33. /// <summary>
  34. /// 将活动目录中的人员信息同步至数据库
  35. /// </summary>
  36. public void SynchronizationADUserToDB()
  37. {
  38.         List<UserInfo> lstADUser = GetUserFromAD();
  39.         List<UserInfo> lstDBUser = GetUserFromDB();
  40.         //取得存在于DB中但不存在于AD中的人员集合
  41.         List<UserInfo> lstImportUser =
  42.                 lstDBUser.Except(lstADUser, new UserInfoComparer()).ToList();
  43.         foreach (UserInfo userInfo in lstImportUser)
  44.         {
  45.                 DeleteUserToDB (userInfo);
  46.         }
  47.         //取得存在于AD中且存在于DB中的人员集合
  48.         lstImportUser = lstADUser.Intersect(lstDBUser, new UserInfoComparer()).ToList();
  49.         foreach (UserInfo userInfo in lstImportUser)
  50.         {
  51.                 UpdateUserToDB (userInfo);
  52.                 lstADUser.Remove(userInfo);
  53.         }
  54.         //取得存在于AD中但不存在于DB中的人员集合
  55.         lstImportUser = lstADUser;
  56.         foreach (UserInfo userInfo in lstImportUser)
  57.         {
  58.                 InsertUserToDB(userInfo);
  59.         }
  60. }

站点的程序设计比较简单,只需要在登录时先验证人员是否存在于数据库中,然后再验证是否可以使用输入的凭证信息登录AD,示例代码如下:

  1. //通过输入的账户信息验证是否存在于数据库中
  2. ……
  3. //验证是否可以使用输入的账户信息登录AD
  4. DirectoryEntry entry = null;
  5. try
  6. {
  7.         entry = new DirectoryEntry(strLDAP, strUserName, strPWD, AuthenticationTypes.Secure);
  8.         object objID = entry.NativeGuid;
  9.         return true;
  10. }
  11. catch
  12. {
  13.         return false;
  14. }
  15. //如果既存在于数据库同时也可以登录AD,则该用户为合法用户

至此,所假设的需求已经实现。如果AD内user数量巨大,最好不要使用此示例中所提供的导入方法,嵌套遍历会使效率极其低下。

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: