using Novell.Directory.Ldap;
namespace Admin.NET.Core;
///
/// 系统域登录信息配置表服务
///
[ApiDescriptionSettings(Order = 100)]
public class SysLdapService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _rep;
private readonly SqlSugarRepository _repUserLdap;
public SysLdapService(SqlSugarRepository rep, SqlSugarRepository repUserLdap)
{
_rep = rep;
_repUserLdap = repUserLdap;
}
///
/// 分页查询系统域登录信息配置表
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Page")]
public async Task> Page(SysLdapInput input)
{
var query = _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
u.Host.Contains(input.SearchKey.Trim())
)
.WhereIF(!string.IsNullOrWhiteSpace(input.Host), u => u.Host.Contains(input.Host.Trim()))
.Select();
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
}
///
/// 增加系统域登录信息配置表
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Add")]
public async Task Add(AddSysLdapInput input)
{
var entity = input.Adapt();
entity.BindPass = CryptogramUtil.Encrypt(input.BindPass);
await _rep.InsertAsync(entity);
return entity.Id;
}
///
/// 删除系统域登录信息配置表
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Delete")]
public async Task Delete(DeleteSysLdapInput input)
{
var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
await _rep.FakeDeleteAsync(entity); //假删除
//await _rep.DeleteAsync(entity); //真删除
}
///
/// 更新系统域登录信息配置表
///
///
///
[HttpPost]
[ApiDescriptionSettings(Name = "Update")]
public async Task Update(UpdateSysLdapInput input)
{
var entity = input.Adapt();
if (!string.IsNullOrEmpty(input.BindPass) && input.BindPass.Length < 32)
{
entity.BindPass = CryptogramUtil.Encrypt(input.BindPass);//未加密的字符串执行加密
}
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
}
///
/// 获取系统域登录信息配置表
///
///
///
[HttpGet]
[ApiDescriptionSettings(Name = "Detail")]
public async Task Detail([FromQuery] QueryByIdSysLdapInput input)
{
return await _rep.GetFirstAsync(u => u.Id == input.Id);
}
///
/// 获取系统域登录信息配置表列表
///
///
///
[HttpGet]
[ApiDescriptionSettings(Name = "List")]
public async Task> List([FromQuery] SysLdapInput input)
{
return await _rep.AsQueryable().Select().ToListAsync();
}
///
/// 账号验证
///
/// 用户Id
/// 密码
/// 租户
///
[NonAction]
public async Task Auth(long tenantId, long userId, string password)
{
var user = await _repUserLdap.GetFirstAsync(u => u.UserId == userId && u.TenantId == tenantId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
var ldap = await _rep.GetFirstAsync(u => u.TenantId == tenantId) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
LdapConnection conn = new LdapConnection();
try
{
conn.Connect(ldap.Host, ldap.Port);
conn.Bind(ldap.Version, ldap.BindDn, ldap.BindPass);
var userEntitys = conn.Search(ldap.BaseDn, LdapConnection.ScopeSub, $"{ldap.AuthFilter}={user.Account}", null, false);
string dn = string.Empty;
while (userEntitys.HasMore())
{
var entity = userEntitys.Next();
var sAMAccountName = entity.GetAttribute(ldap.AuthFilter)?.StringValue;
if (!string.IsNullOrEmpty(sAMAccountName))
{
dn = entity.Dn;
break;
}
}
if (string.IsNullOrEmpty(dn)) throw Oops.Oh(ErrorCodeEnum.D1002);
LdapAttribute attr = new LdapAttribute("userPassword", password);
conn.Bind(dn, password);
}
catch (LdapException e)
{
switch (e.ResultCode)
{
case LdapException.NoSuchObject:
case LdapException.NoSuchAttribute:
throw Oops.Oh(ErrorCodeEnum.D0009);
case LdapException.InvalidCredentials:
return false;
default:
throw Oops.Oh(e.Message);
}
}
finally
{
conn.Disconnect();
}
return true;
}
}