Хорошо, я пытаюсь написать Pluggable-Authentication-Module (PAM), написанный на C#.
В качестве доказательства концепции я пытаюсь повторно реализовать следующий простой модуль PAM на С#:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
/* expected hook */
PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv ) {
return PAM_SUCCESS;
}
PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
printf("Acct mgmt\n");
return PAM_SUCCESS;
}
/* expected hook, this is where custom stuff happens */
PAM_EXTERN int pam_sm_authenticate( pam_handle_t *pamh, int flags,int argc, const char **argv ) {
int retval;
const char* pUsername;
retval = pam_get_user(pamh, &pUsername, "Username: ");
printf("Welcome %s\n", pUsername);
if (retval != PAM_SUCCESS) {
return retval;
}
if (strcmp(pUsername, "bob") != 0) {
return PAM_AUTH_ERR;
}
return PAM_SUCCESS;
}
Я прочитал о p/Invoke и кажется, мне нужно написать какую-то "обертку". Проблема, с которой я сталкиваюсь, заключается в том, что во всех примерах есть упакованная DLL, и я не уверен, что здесь эквивалентно этому. Разве PAM не скомпилирован в ядро? Как вы это "оборачиваете"?
Для тех из вас, кто качает головой и спрашивает: «Почему, но почему?»?
Источник аутентификации, с которым я пытаюсь работать (Azure AD), не имеет библиотеки C или C++, но имеет библиотеку C#. Microsoft сообщила мне, что я должен иметь возможность использовать .NET Core в Linux для создания модуля PAM на C#.
-------------------------- ОБНОВИТЬ ----------------------- -
Хорошо, я узнал кучу способов, которые не работают, и я решил, что должен задокументировать их здесь.
Во-первых, не похоже, что Неуправляемый экспорт будет работать.
- Пакет NuGet, реализующий это, не работает на dotnetcore и, следовательно, не работает в Linux.
- ildasm / ilasm, которые необходимы для этого вручную, появляются только в Windows.
- Даже те DLL, скомпилированные в Linux, не имеют заголовка ELF. Без заголовка ELF их, по-видимому, нельзя использовать в PAM, и я ожидаю, что они не будут работать ни в одном интерфейсе плагина/модуля.
Кстати, стоит отметить, что существует новый запрос функции для компилятора .Net (кодовое имя Rosyln) для Неуправляемый экспорт должен быть нативным. Я не понимаю, почему этого еще нет, но похоже, что без заголовков ELF даже с этим это не сработает.
Мы кратко рассмотрели Mono, как предложил @piedar, но это выглядело как самый сложный вариант. Теперь похоже, что это может быть единственным вариантом.
Кажется, что это должно быть намного проще, чем кажется.
DllImport("libpam.so.0")
или подобное. - person Remus Rusanu   schedule 06.10.2016