Im ищет рекомендации по аутентификации комбинации пользователей и паролей и проверке групповой ассоциации в разных операционных системах. В основном у меня есть приложение С#, которое работает как в MS Visual Studio С#, так и в Mono С#, и мне нужно добавить механизм аутентификации для поддержки Windows, Linux и MacOSX.
Для Windows я написал быстрый С# interop для использования только API LogonUser для Windows. Это работает хорошо, но не работает для систем, отличных от Windows. Мои конечные цели заключаются в том, чтобы один и тот же набор кодов запускался на всех платформах (Windows, Linux и MacOSX) с минимальным количеством зависимых от ОС#ifdefing.
Одна заметка - я отчаянно пытаюсь использовать встроенные учетные записи пользователей ОС. Я предпочитаю не поддерживать собственное хранилище учетных записей пользователей.
Любые мысли или рекомендации по подходам, методам аутентификации пользователей и т.д. приветствуются.
Я не уверен, как работает проверка подлинности на linux и mac, но первое, что приходит мне на ум, - это реализовать интерфейс IAuthenticator и иметь классы аутентификации ОС. Затем вы можете перейти к соответствующему классу вручную через Dependecy Injection или, возможно, динамически во время выполнения... но каким-то образом ваше приложение должно быть в состоянии определить, в какой ОС он работает.
Каждая система обрабатывает локальную аутентификацию по-разному. Как отметил @Darnell, вам, вероятно, понадобится написать интерфейс для вашей аутентификации и скрыть системный бэкэнд.
Если вам нужно иметь одни и те же учетные записи пользователей в нескольких системах, ldap для информации о пользователе и Kerberos для аутентификации - это единственный полностью поддерживаемый кросс-платформенный способ обработки.
За исключением приложения "kerberizing" и настаивая на том, что он работает только в эквивалентной среде, универсального метода аутентификации нет. Кроме того, LDAP действительно является единственным переносным способом запроса информации о группе.
Более простой (более переносимый) вариант может заключаться в использовании предварительно открытого ключа. Таким образом, пользователь будет разрешать только вашу программу, предоставив ей ключ для подписывания сообщений. Проверка сообщения против соответствующего ключа пользователя позволит вам знать, что a) пользователь существует локально, и b) сообщение поступает от источника, который разрешен пользователем. У вас все еще есть проблема без универсального поиска в группе, но вам, вероятно, придется это делать самостоятельно, если вы не можете положиться на ldap.
Примечание. Мне все еще нужно подчеркнуть следующее.
Я бы настоятельно рекомендовал не использовать какой-либо пароль в вашем сообщении, даже если это требует от вас поддержки собственной базы данных пользователя/пароля. Вы бы обошли парадигму местной безопасности и открыли систему для повышения безопасности. Это еще более важно, если система использует kerberos/ActiveDirectory, где делаются большие длины, чтобы гарантировать, что пароль пользователя никогда не передается по проводу. Использование СУБД в качестве примера - большинство из них не привязаны к локальной базе данных пользователей (по крайней мере по умолчанию) и реализуют свои собственные механизмы аутентификации пользователей. Посмотрите, как безопасность работает в MySQL или PostgreSQL.