Интеграция Active Directory для сопоставления ролей приложений - PullRequest
0 голосов
/ 19 марта 2020

Я создаю REST API (. NET Core с Entity Framework) и Angular внешний интерфейс. Что я хочу достичь с точки зрения безопасности, это своего рода интеграция с AD. Я хотел бы предоставить разрешения приложений группам пользователей и пользователям. Будет администратор, сопоставляющий этих пользователей / группы с ролями. Каков наилучший способ сделать это? Должен ли я создать микросервис, который каждую минуту запрашивает AD и обновляет все группы и пользователей в приложении? Или, может быть, постоянное соединение с AD каждый раз, когда пользователь-администратор хочет предоставить / отозвать чье-то разрешение? Я думаю, что второй способ может не сработать, потому что каждый раз, когда пользователь входит в систему, мне нужно запрашивать AD, чтобы увидеть его / ее группы AD и проверить, есть ли у пользователя доступ.

Итак, что я придумал, так это аутентификация токена JWT и микросервис, который будет импортировать всех пользователей / группы и сопоставления между ними, поэтому вся аутентификация происходит внутри базы данных приложения / приложения, а не постоянно запрашивает AD (что довольно медленно из того, что я помню).

Можете ли вы дать мне несколько идей по улучшению? Может быть, мне не хватает некоторых решений? Является ли токен JWT лучшим способом для go здесь?

1 Ответ

0 голосов
/ 20 марта 2020

Может быть, этот код поможет вам. Помните, что Parameter.GetStringValue - это персональный пользовательский метод, замените его тем, что вы хотите.


using System;
using System.Text;
using System.DirectoryServices;

    public class Ldap
    {
        private string _path;
        private string _filterAttribute;

        /// <summary>
        /// prepares LDAP path to use in this class. Something like LDAP://myLANdomain.local
        /// </summary>
        /// <param name="path">If empty will get the value on Parameter 'LANdomain'</param>
        public Ldap(string path = "")
        {
            if (String.IsNullOrEmpty(path))
            {
                string domain = Parameter.GetStringValue("LANdomain");
                if (String.IsNullOrEmpty(domain))
                    throw new Exception("Domain is not defined");

                path = "LDAP://" + domain; //Fully-qualified Domain Name
            }

            _path = path;
        }

        //Error Error 0x80005000 go to IIS and recycle App Pool
        public bool IsAuthenticated(string username, string pwd, string domain ="")
        {

            if (String.IsNullOrEmpty(domain))
                domain = Parameter.GetStringValue("LANdomain");

            if (String.IsNullOrEmpty(domain))
                throw new Exception("Domain is not defined");

            string domainAndUsername = domain + @"\" + username;
            using (DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd))
            {
                try
                {
                    //Bind to the native AdsObject to force authentication.
                    object obj = entry.NativeObject;

                    using (DirectorySearcher search = new DirectorySearcher(entry))
                    {
                        //"(&(objectClass=user)(objectCategory=person)(|(SAMAccountName=*{0}*)(cn=*{0}*)(gn=*{0}*)(sn=*{0}*)(email=*{0}*)))"
                        search.Filter = "(&(objectCategory=person)(objectClass=user)(SAMAccountName=" + username + "))";
                        search.PropertiesToLoad.Add("cn");
                        SearchResult result = search.FindOne();

                        if (null == result)
                        {
                            return false;
                        }

                        //Update the new path to the user in the directory.
                        _path = result.Path;
                        _filterAttribute = (String)result.Properties["cn"][0];

                        return true;
                    }


                }
                //catch (DirectoryServicesCOMException cex)
                catch //(Exception ex)
                {
                    throw;
                    //throw new Exception("Error authenticating LDAP user. " + ex.Message);
                }


            }


        }



    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...