Вызов C# из C в Linux

Хорошо, я пытаюсь написать 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#.

-------------------------- ОБНОВИТЬ ----------------------- -

Хорошо, я узнал кучу способов, которые не работают, и я решил, что должен задокументировать их здесь.

Во-первых, не похоже, что Неуправляемый экспорт будет работать.

  1. Пакет NuGet, реализующий это, не работает на dotnetcore и, следовательно, не работает в Linux.
  2. ildasm / ilasm, которые необходимы для этого вручную, появляются только в Windows.
  3. Даже те DLL, скомпилированные в Linux, не имеют заголовка ELF. Без заголовка ELF их, по-видимому, нельзя использовать в PAM, и я ожидаю, что они не будут работать ни в одном интерфейсе плагина/модуля.

Кстати, стоит отметить, что существует новый запрос функции для компилятора .Net (кодовое имя Rosyln) для Неуправляемый экспорт должен быть нативным. Я не понимаю, почему этого еще нет, но похоже, что без заголовков ELF даже с этим это не сработает.

Мы кратко рассмотрели Mono, как предложил @piedar, но это выглядело как самый сложный вариант. Теперь похоже, что это может быть единственным вариантом.

Кажется, что это должно быть намного проще, чем кажется.


person Doug    schedule 06.10.2016    source источник
comment
Я думаю, это должно быть DllImport("libpam.so.0") или подобное.   -  person Remus Rusanu    schedule 06.10.2016
comment
Это не так просто. PAM загружает двоичные файлы .so во время выполнения и ожидает, что они будут содержать определенный набор функций в стиле C. Я бы сказал, что лучше всего использовать встроенный Mono для вызова управляемая сборка.   -  person piedar    schedule 06.10.2016
comment
@piedar Спасибо. Это определенно помогает, и я проверяю это. Основываясь на языке, который вы использовали, я также нашел это channel9.msdn.com/Forums/Coffeehouse/ Мы тоже ищем этот путь.   -  person Doug    schedule 06.10.2016
comment
Вот пример взаимодействия Mono, который может быть вам полезен: цель c"> stackoverflow.com/questions/5692813/   -  person zneak    schedule 11.10.2016
comment
Кроме того, несмотря на то, что говорится в заголовке, мне кажется, что вы больше смотрите на вызов C # из C, чем наоборот.   -  person zneak    schedule 11.10.2016
comment
@zneak Спасибо за оба комментария. Вы правы, я обновил заголовок и проверю этот пост!   -  person Doug    schedule 11.10.2016
comment
Вам когда-нибудь удавалось создать модуль PAM на C#?   -  person MrCalvin    schedule 24.02.2020
comment
@MrCalvin Нет, в итоге мы просто написали это на C. После этого мы нашли несколько модулей Pam на Rust; так что это будет вариант.   -  person Doug    schedule 24.02.2020