Блокировка некоторых функций моего приложения в зависимости от того, кто входит в систему (на основе AD auth) - PullRequest
0 голосов
/ 01 апреля 2019

Мне нужен совет, пожалуйста. У меня есть приложение на C # (и WPF для разработки) с обязательной аутентификацией ActiveDirectory. В настоящее время я просто проверяю правильность имени пользователя и пароля перед тем, как войти в систему. Но теперь я должен предоставить доступ к некоторым функциям в зависимости от того, кто входит в мое приложение (некоторые пользователи могут иметь полный доступ, некоторые другие могут иметь заблокированные функции ).

Интересно, как это сделать ... Если у кого-то есть пример или какое-либо руководство:)

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Вы можете создать классы, которые реализуют интерфейсы IIdentity и IPrincipal и переопределить идентичность потока приложения по умолчанию в вашем файле App.xaml.cs:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        //Create a custom principal with an anonymous identity at startup
        CustomPrincipal customPrincipal = new CustomPrincipal();
        AppDomain.CurrentDomain.SetThreadPrincipal(customPrincipal);

        base.OnStartup(e);
    }
}

Затем вы можете использовать PrincipalPermissionAttribute для выполнения декларативных или обязательных проверок безопасности в вашем приложении.

Пожалуйста, обратитесь к этому сообщению в блоге для получения дополнительной информации и полного примера.

1 голос
/ 01 апреля 2019

Это действительно зависит от того, как должна выглядеть ваша архитектура. Я бы предложил различные модули, в том числе класс инициализации, который может добавлять кнопки в меню в методе init. Тогда вы можете использовать аннотацию для этого класса, включая необходимые права пользователя. Всякий раз, когда вы инициализируете все приложение, вы можете перебирать классы инициализации и вызывать метод init, если у пользователя есть доступ.

0 голосов
/ 01 апреля 2019

Я наконец нашел решение. 1-е: я проверяю, аутентифицирован ли пользователь. Если true, "goto" 2nd;)

        public bool IsAuthenticated(string username, string passwd, string domain)
    {
        try
        {
            DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, username, passwd, AuthenticationTypes.Secure);
            DirectorySearcher search = new DirectorySearcher(entry)
            {
                Filter = "(objectClass=user)",
                SearchScope = SearchScope.Subtree
            };
            SearchResult result = search.FindOne();

            return (result != null);
        }
        catch (Exception ex)
        {
            throw new Exception("Authentication Error.\n" + ex.Message);
        }

2-й: Я проверяю, в какой группе находится пользователь. Мой доступ отличается в основном на 3 группы. Я использовал простое условное выражение, подобное этому:

            if (IsAuthenticated(user, password, LdapCmb))
            {
                // Connection ok
                if (AuthenticateGroup(user, password, userLdap, GroupADM))
                {
                    accessRights = "ADM";
                    // Variable passed to another class (for locking down some contents)
                }
                else if (AuthenticateGroup(user, password, userLdap, OtherGroup1))
                {
                    accessRights = "OTHER1";
                    // Variable passed to another class (for locking down some contents)
                }
                else if (AuthenticateGroup(user, password, userLdap, OtherGroup2))
                {
                    accessRights = "OTHER2";
                    // Variable passed to another class (for locking down some contents)
                }
                else
                {
                    MessageBox.Show(this, "You are not authorized to use this application.", MessageBoxButton.OK, MessageBoxImage.Warning);
                    logIt.AppendText("User " + user + " isn't granted for use");
                    Application.Current.Shutdown();
                }
                Close();
            }
            else
            {
                    MessageBox.Show(this, "You are not authorized to use this application.", MessageBoxButton.OK, MessageBoxImage.Warning);
                    logIt.AppendText("User " + user + " isn't granted for use");

                Close();
            }

И, наконец, вот метод «authenticateGroup»:

        public bool AuthenticateGroup(string userName, string password, string domain, string group)
    {

        try
        {
            DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password);
            DirectorySearcher mySearcher = new DirectorySearcher(entry)
            {
                Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))"
            };
            SearchResult result = mySearcher.FindOne();

            foreach (string GroupPath in result.Properties["memberOf"])
            {
                if (GroupPath.Contains(group))
                {
                    return true;
                }
            }
        }
        catch (DirectoryServicesCOMException ex)
        {
            Console.WriteLine(ex.Message);
        }
        return false;
    }

Это, конечно, не самый лучший метод ... но, по крайней мере, он работает, как и ожидалось в данный момент. Теперь я должен проверить это глубже.

В любом случае, спасибо.

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