Как пройти аутентификацию в Active Directory с помощью gsasl gssapi? - PullRequest
3 голосов
/ 15 марта 2020

Я пытаюсь пройти аутентификацию в домене Active Directory с помощью gsasl. Я уже kinit'd в качестве администратора. Я пытался следовать тестовому коду в gsasl tests / gssapi. c, но приведенный ниже код не работает с GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR при вызове gsasl_step64 ().

static int callback(Gsasl *ctx, Gsasl_session *sctx, Gsasl_property prop)
{
    int ret = GSASL_NO_CALLBACK;

    switch (prop) {
        case GSASL_AUTHZID:
            gsasl_property_set(sctx, GSASL_AUTHZID, "Administrator");
            ret = GSASL_OK;
            break;

        case GSASL_SERVICE:
            gsasl_property_set(sctx, prop, "host");
            ret = GSASL_OK;
            break;

        case GSASL_HOSTNAME:
            char hostname[HOST_NAME_MAX];
            gethostname(hostname, HOST_NAME_MAX);
            gsasl_property_set(sctx, prop, hostname);
            ret = GSASL_OK;
            break;

        default:
            break;
    }

    return ret;
}

int main()
{
    Gsasl *ctx = NULL;
    Gsasl_session *session;
    char *s1 = NULL, *s2 = NULL;
    int ret;

    ret = gsasl_init(&ctx);
    if (ret != GSASL_OK) {
        cerr << "gsasl_init failed" << endl;
        return ret;
    }

    if (!gsasl_client_support_p(ctx, "GSSAPI")) {
        cerr << "No support for GSSAPI." << endl;
        return 77;
    }

    gsasl_callback_set(ctx, callback);

    ret = gsasl_client_start(ctx, "GSSAPI", &session);
    if (ret != GSASL_OK) {
        cerr << "gsasl_client_start failed" << endl;
        return ret;
    }

    do {
        ret = gsasl_step64(session, s2, &s1);
        gsasl_free(s2);
        if (ret != GSASL_OK && ret != GSASL_NEEDS_MORE) {
            cerr << "gsasl_step64 failed " << ret << endl;
            return ret;
        }
    } while (ret != GSASL_OK);

    if (s1) {
        gsasl_free(s1);
    }

    gsasl_finish(session);
}

Кто-нибудь видит, что я делаю неправильно?

1 Ответ

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

Не совсем четкий ответ, потому что в настоящее время я не использую AD, поэтому не могу подтвердить свой ответ. Но чтобы локализовать проблему:

я бы сначала попробовал examples . Может быть, этот тест желательно провалить. Если это не работает с примерами, я бы исследовал источник библиотеки библиотеки GNU SASL.

Вот выдержка из источника библиотеки, которая выдает эту ошибку:

maj_stat = gss_init_sec_context (&min_stat,
                                    GSS_C_NO_CREDENTIAL,
                                    &state->context,
                                    state->service,
                                    state->mech_oid,
                                    GSS_C_MUTUAL_FLAG,
                                     0,
                                    &state->cb,
                                    buf,
                                    &actual_mech_type,
                                    &state->token, &ret_flags, NULL);

if (maj_stat != GSS_S_COMPLETE && maj_stat != GSS_S_CONTINUE_NEEDED)
    return GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR;

Как видите, вызывается функция gss_init_sec_context(), в предложении if будут проверены только GSS_S_COMPLETE и GSS_S_CONTINUE_NEEDED. Но gss_init_sec_context() имеет гораздо больше кодов состояния . Поэтому я бы изменил код библиотеки и распечатал более понятный код ошибки, почему он не работает.

Также была проблема в WINBIND / SAMBA, не знаю, используете ли вы SAMBA, которая выдает неопределенную ошибку в этой указанной c функции.

...