![]()
using Microsoft.Extensions.Configuration;
using Novell.Directory.Ldap;
using ProGra.Services.ADService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Logger = Infrastructure.Logging.Logger;
namespace ProGra.Services
{
public class LdapService : IADService
{
private readonly string DomainAdminUser;
private readonly string DomainAdminPassword;
private readonly string Domin;
private readonly string BaseDc;
private readonly IConfiguration _configuration;
private readonly string Host;
public LdapService(IConfiguration Configuration)
{
_configuration = Configuration;
Host = _configuration.GetSection("Ldap")["Host"];
DomainAdminUser = _configuration.GetSection("Ldap")["DomainAdminUser"];
DomainAdminPassword = _configuration.GetSection("Ldap")["DomainAdminPassword"];
Domin = _configuration.GetSection("Ldap")["Domin"];
BaseDc = _configuration.GetSection("Ldap")["BaseDc"];
}
public ApplicationUser GetApplicationUserByAccountName(string UserName)
{
try
{
using (var connection = new LdapConnection())
{
connection.Connect(Host, LdapConnection.DefaultPort);
connection.Bind(Domin + "\\" + DomainAdminUser, DomainAdminPassword);
var entities =connection.Search(BaseDc, LdapConnection.ScopeSub,$"sAMAccountName={UserName}",
new string[] { "objectGUID", "sAMAccountName", "mail", "displayname" }, false);
var entity = entities.Next();
return new ApplicationUser
{
Id = new Guid(entity.GetAttribute("objectGUID").ByteValue).ToString(),
SamAccountName = entity.GetAttribute("sAMAccountName").StringValue,
Email = entity.GetAttribute("mail").StringValue,
UserName = entity.GetAttribute("displayname").StringValue,
DisplayName = entity.GetAttribute("displayname").StringValue,
};
}
}
catch (Exception e )
{
Logger.Error("ldap", e);
return null;
}
}
public bool IsMemberOf(string UserName)
{
throw new NotImplementedException();
}
public List<(string, bool)> IsMemberOfGroups(string UserName)
{
List<(string, bool)> Memberships = new List<(string, bool)>();
try
{
using (var connection = new LdapConnection())
{
connection.Connect(Host, LdapConnection.DefaultPort);
connection.Bind(Domin + "\\" + DomainAdminUser, DomainAdminPassword);
var entities =connection.Search(BaseDc, LdapConnection.ScopeSub,$"sAMAccountName={UserName}",new string[] { "memberof" }, false);
var entity = entities.Next();
var memberships = entity.GetAttribute("memberof").StringValueArray.ToList();
var sections = _configuration.GetSection("MemberShip").GetChildren();
foreach (var section in sections)
{
var groupName = section.Value.ToString();
if (memberships.Any(x=>x.Contains(groupName)))
{
Memberships.Add((groupName, true));
}
else
{
Memberships.Add((groupName, false));
}
}
}
return Memberships;
}
catch (Exception e)
{
Logger.Error("ldap", e);
return null;
}
}
public bool ValidateCredentials(string UserName, string Password)
{
try
{
using var connection = new LdapConnection();
connection.Connect(Host, LdapConnection.DefaultPort);
connection.Bind(Domin + "\\" + UserName, Password);
return true;
}
catch (Exception e)
{
Logger.Error("ldap", e);
return false;
}
}
}
}