SysLdapService.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using Novell.Directory.Ldap;
  2. namespace Admin.NET.Core;
  3. /// <summary>
  4. /// 系统域登录信息配置表服务
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 100)]
  7. public class SysLdapService : IDynamicApiController, ITransient
  8. {
  9. private readonly SqlSugarRepository<SysLdap> _rep;
  10. private readonly SqlSugarRepository<SysUserLdap> _repUserLdap;
  11. public SysLdapService(SqlSugarRepository<SysLdap> rep, SqlSugarRepository<SysUserLdap> repUserLdap)
  12. {
  13. _rep = rep;
  14. _repUserLdap = repUserLdap;
  15. }
  16. /// <summary>
  17. /// 分页查询系统域登录信息配置表
  18. /// </summary>
  19. /// <param name="input"></param>
  20. /// <returns></returns>
  21. [HttpPost]
  22. [ApiDescriptionSettings(Name = "Page")]
  23. public async Task<SqlSugarPagedList<SysLdapOutput>> Page(SysLdapInput input)
  24. {
  25. var query = _rep.AsQueryable()
  26. .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
  27. u.Host.Contains(input.SearchKey.Trim())
  28. )
  29. .WhereIF(!string.IsNullOrWhiteSpace(input.Host), u => u.Host.Contains(input.Host.Trim()))
  30. .Select<SysLdapOutput>();
  31. return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
  32. }
  33. /// <summary>
  34. /// 增加系统域登录信息配置表
  35. /// </summary>
  36. /// <param name="input"></param>
  37. /// <returns></returns>
  38. [HttpPost]
  39. [ApiDescriptionSettings(Name = "Add")]
  40. public async Task<long> Add(AddSysLdapInput input)
  41. {
  42. var entity = input.Adapt<SysLdap>();
  43. entity.BindPass = CryptogramUtil.Encrypt(input.BindPass);
  44. await _rep.InsertAsync(entity);
  45. return entity.Id;
  46. }
  47. /// <summary>
  48. /// 删除系统域登录信息配置表
  49. /// </summary>
  50. /// <param name="input"></param>
  51. /// <returns></returns>
  52. [HttpPost]
  53. [ApiDescriptionSettings(Name = "Delete")]
  54. public async Task Delete(DeleteSysLdapInput input)
  55. {
  56. var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
  57. await _rep.FakeDeleteAsync(entity); //假删除
  58. //await _rep.DeleteAsync(entity); //真删除
  59. }
  60. /// <summary>
  61. /// 更新系统域登录信息配置表
  62. /// </summary>
  63. /// <param name="input"></param>
  64. /// <returns></returns>
  65. [HttpPost]
  66. [ApiDescriptionSettings(Name = "Update")]
  67. public async Task Update(UpdateSysLdapInput input)
  68. {
  69. var entity = input.Adapt<SysLdap>();
  70. if (!string.IsNullOrEmpty(input.BindPass) && input.BindPass.Length < 32)
  71. {
  72. entity.BindPass = CryptogramUtil.Encrypt(input.BindPass);//未加密的字符串执行加密
  73. }
  74. await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
  75. }
  76. /// <summary>
  77. /// 获取系统域登录信息配置表
  78. /// </summary>
  79. /// <param name="input"></param>
  80. /// <returns></returns>
  81. [HttpGet]
  82. [ApiDescriptionSettings(Name = "Detail")]
  83. public async Task<SysLdap> Detail([FromQuery] QueryByIdSysLdapInput input)
  84. {
  85. return await _rep.GetFirstAsync(u => u.Id == input.Id);
  86. }
  87. /// <summary>
  88. /// 获取系统域登录信息配置表列表
  89. /// </summary>
  90. /// <param name="input"></param>
  91. /// <returns></returns>
  92. [HttpGet]
  93. [ApiDescriptionSettings(Name = "List")]
  94. public async Task<List<SysLdapOutput>> List([FromQuery] SysLdapInput input)
  95. {
  96. return await _rep.AsQueryable().Select<SysLdapOutput>().ToListAsync();
  97. }
  98. /// <summary>
  99. /// 账号验证
  100. /// </summary>
  101. /// <param name="userId">用户Id</param>
  102. /// <param name="password">密码</param>
  103. /// <param name="tenantId">租户</param>
  104. /// <returns></returns>
  105. [NonAction]
  106. public async Task<bool> Auth(long tenantId, long userId, string password)
  107. {
  108. var user = await _repUserLdap.GetFirstAsync(u => u.UserId == userId && u.TenantId == tenantId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
  109. var ldap = await _rep.GetFirstAsync(u => u.TenantId == tenantId) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
  110. LdapConnection conn = new LdapConnection();
  111. try
  112. {
  113. conn.Connect(ldap.Host, ldap.Port);
  114. conn.Bind(ldap.Version, ldap.BindDn, ldap.BindPass);
  115. var userEntitys = conn.Search(ldap.BaseDn, LdapConnection.ScopeSub, $"{ldap.AuthFilter}={user.Account}", null, false);
  116. string dn = string.Empty;
  117. while (userEntitys.HasMore())
  118. {
  119. var entity = userEntitys.Next();
  120. var sAMAccountName = entity.GetAttribute(ldap.AuthFilter)?.StringValue;
  121. if (!string.IsNullOrEmpty(sAMAccountName))
  122. {
  123. dn = entity.Dn;
  124. break;
  125. }
  126. }
  127. if (string.IsNullOrEmpty(dn)) throw Oops.Oh(ErrorCodeEnum.D1002);
  128. LdapAttribute attr = new LdapAttribute("userPassword", password);
  129. conn.Bind(dn, password);
  130. }
  131. catch (LdapException e)
  132. {
  133. switch (e.ResultCode)
  134. {
  135. case LdapException.NoSuchObject:
  136. case LdapException.NoSuchAttribute:
  137. throw Oops.Oh(ErrorCodeEnum.D0009);
  138. case LdapException.InvalidCredentials:
  139. return false;
  140. default:
  141. throw Oops.Oh(e.Message);
  142. }
  143. }
  144. finally
  145. {
  146. conn.Disconnect();
  147. }
  148. return true;
  149. }
  150. }