PlatformNotSupportedException:System.DirectoryServices.AccountManagement

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;
            }
        }

    }
}

  

posted @ 2021-07-12 15:43  面无表情的石头  阅读(179)  评论(0)    收藏  举报