Как получить группы Active Directory пользователя из веб-службы, размещенной в службе Windows - PullRequest
0 голосов
/ 15 октября 2019

У меня есть веб-приложение, которое хранит документы на сервере. В некоторых случаях мне нужно разместить определенные разрешения для групп пользователей, поскольку они хранятся в Active Directory.

Я настроил веб-службу, размещенную в службе Windows, на сервере, и сервер устанавливает связь сэтот веб-сервис для получения данных.

Когда я вызываю методы из обычного консольного приложения, все отлично работает, а также если я вызываю веб-сервис, когда он размещен локально на моем компьютере в службе Windows, все работаеттакже отлично.

Проблема возникает только когда на сервере - я думаю, что, когда никто не вошел на сервер.

Редактировать: Пользовательнайдено (я думаю) и в результате я получаю "Группы не найдены".

===========

Другое Редактирование: Iобновил код с дальнейшей работой пытаюсь.

После многих экспериментов метод2 вообще не подходит. Метод 2 требует, чтобы я выполнил вход в систему с пользователем, которого я хочу проверить, чтобы получить его группы. Это то, что нельзя сделать, поскольку у меня нет этого пароля пользователя.

Я считаю, что два других метода (1 и 3) не работают из-за чего-то со структурой сети, и мне придется поговорить смой босс об этом. Я буду обновлять снова, если у меня будет прогресс.

========== *

Вот ссылка на код C #, который я использую для получения групп, 3 разныхметоды - ни один из них не работает.

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class ActiveDirectoryService : System.Web.Services.WebService
{
        [WebMethod]
        public string GetGroups1(string endUsername)
        {
            string result;
            try
            {
                var list = new List<string>();
                var domain = ConfigurationManager.AppSettings["Domain"];
                var serviceUsername = ConfigurationManager.AppSettings["Username"];
                var password = ConfigurationManager.AppSettings["Password"];
                var context = new PrincipalContext(ContextType.Domain, domain, serviceUsername, password);
                var userPrincipal = UserPrincipal.FindByIdentity(context, endUsername);

                if (userPrincipal == null)
                {
                    return "Failed to find user: " + endUsername;
                }

                var authorizationGroups = userPrincipal.GetAuthorizationGroups();
                WriteToLogDebug("GetGroups1.authorizationGroups.Count: " + authorizationGroups.Count());
                foreach (var current in authorizationGroups)
                {
                    if (current is GroupPrincipal)
                    {
                        var groupPrincipal = current as GroupPrincipal;
                        var groupPrincipalName = groupPrincipal?.Name;
                        if (!string.IsNullOrWhiteSpace(groupPrincipalName))
                        {
                            list.Add(groupPrincipalName);
                        }
                    }
                }

                if (!list.Any())
                {
                    result = "No groups found for user " + endUsername;
                }
                else
                {
                    result = string.Join(" & ", list);
                }
            }
            catch (Exception ex)
            {
                result = "Failed to get groups for user " + endUsername + ": " + ex.Message;
                WriteToLogException("GetGroups1." + ex.Message);
            }
            return result;
        }

        [WebMethod]
        public string GetGroups2(string endUsername)
        {
            string result;
            var serviceUsername = ConfigurationManager.AppSettings["Username"];

            try
            {
                var list = new List<string>();

                IntPtr token = GetLogonUserToken();
                if (token == default(IntPtr))
                {
                    return "Failed to logon user: " + serviceUsername;
                }

                var windowsIdentity = new WindowsIdentity(token);
                WriteToLogDebug("GetGroups2.windowsIdentity.Groups.Count: " + windowsIdentity.Groups.Count());

                foreach (var current in windowsIdentity.Groups)
                {
                    try
                    {
                        list.Add(current.Translate(typeof(NTAccount)).ToString());
                    }
                    catch (Exception ex)
                    {
                        WriteToLogException("GetGroups2." + ex.Message);
                    }
                }
                if (!list.Any())
                {
                    result = "No groups found for user " + serviceUsername;
                }
                else
                {
                    result = string.Join(" & ", list);
                }
            }
            catch (Exception ex)
            {
                result = "Failed to get groups for user " + serviceUsername + ": " + ex.Message;
                WriteToLogException("GetGroups2." + ex.Message);
            }
            return result;
        }

        [WebMethod]
        public string GetGroups3(string endUsername)
        {
            var result = "No groups found";
            try
            {
                var directoryEntry = GetDirectoryEntry();
                if (directoryEntry == null)
                {
                    result = "DirectoryEntry returned null";
                }
                else
                {
                    var list = new List<string>();
                    var directorySearcher = new DirectorySearcher(directoryEntry)
                    {
                        Filter = "(&(sAMAccountName=" + endUsername + "))"
                    };
                    if (directorySearcher == null)
                    {
                        WriteToLogDebug("GetGroups3.(directorySearcher == null): " + (directorySearcher == null));
                        return "Failed to initiate directorySearcher";
                    }

                    SearchResultCollection searchResultCollection = null;
                    try
                    {
                        searchResultCollection = directorySearcher.FindAll();
                        if (searchResultCollection == null)
                        {
                            WriteToLogDebug("GetGroups3.(searchResultCollection == null): " + (searchResultCollection == null));
                            return "Failed to find user: " + endUsername;
                        }
                    }
                    catch (Exception ex)
                    {
                        WriteToLogException("GetGroups3.Failed: " + ex.Message);
                        return "Failed to find user " + endUsername + ": " + ex.Message;
                    }

                    if (searchResultCollection.Count == 0)
                    {
                        result = "No groups found for user " + endUsername;
                    }
                    else
                    {
                        WriteToLogDebug("GetGroups3.searchResultCollection.Count: " + searchResultCollection.Count);
                        foreach (var current in searchResultCollection)
                        {
                            var searchResult = current as SearchResult;
                            foreach (var group in searchResult?.Properties["memberOf"])
                            {
                                if (group != null)
                                    list.Add(group.ToString());
                            }
                        }
                        result = string.Join(" & ", list);
                    }
                }
            }
            catch (Exception ex)
            {
                result = "Failed to get groups for user " + endUsername + ": " + ex.Message;
                WriteToLogException("GetGroups3.Failed: " + ex.Message);
            }
            return result;
        }

        private IntPtr GetLogonUserToken()
        {
            try
            {
                var LOGON32_LOGON_INTERACTIVE = 2;
                //var LOGON32_LOGON_NETWORK = 3;
                //var LOGON32_LOGON_BATCH = 4;
                //var LOGON32_LOGON_SERVICE = 5;
                //var LOGON32_LOGON_UNLOCK = 7;
                //var LOGON32_LOGON_NETWORK_CLEARTEXT = 8;
                //var LOGON32_LOGON_NEW_CREDENTIALS = 9;

                var LOGON32_PROVIDER_DEFAULT = 0;

                var domain = ConfigurationManager.AppSettings["Domain"];
                WriteToLogDebug("GetLogonUserToken.domain: " + domain);
                var serviceUsername = ConfigurationManager.AppSettings["Username"];
                WriteToLogDebug("GetLogonUserToken.serviceUsername: " + serviceUsername);
                var password = ConfigurationManager.AppSettings["Password"];
                WriteToLogDebug("GetLogonUserToken.password: " + password);
                LogonUser(serviceUsername, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out IntPtr token);
                return token;
            }
            catch (Exception ex)
            {
                WriteToLogException("GetLogonUserToken.Failed" + ex.Message);
            }
            return default(IntPtr);
        }

        private DirectoryEntry GetDirectoryEntry()
        {
            DirectoryEntry result;
            try
            {
                var domain = ConfigurationManager.AppSettings["Domain"];
                WriteToLogDebug("GetDirectoryEntry.domain: " + domain);
                var serviceUsername = ConfigurationManager.AppSettings["Username"];
                WriteToLogDebug("GetDirectoryEntry.serviceUsername: " + serviceUsername);
                var password = ConfigurationManager.AppSettings["Password"];
                WriteToLogDebug("GetDirectoryEntry.password: " + password);
                result = new DirectoryEntry
                {
                    Username = serviceUsername,
                    Password = password,
                    Path = "LDAP://" + domain
                };
            }
            catch (Exception ex)
            {
                result = null;
                WriteToLogException("GetDirectoryEntry.Failed: " + ex.Message);
            }
            return result;
        }

Любые предложения, как получить группы пользователей из веб-службы, размещенной в службе Windows?

Спасибо

1 Ответ

0 голосов
/ 24 октября 2019

В конце концов, это действительно был сетевой блок, после изменения используемого домена мне удалось получить конечных пользователей и их группы. Спасибо всем за помощь.

...