如何使用gsasl gssapi向Active Directory进行身份验证?

问题描述 投票:1回答:1

我正在尝试使用gsasl对Active Directory域进行身份验证。我已经初始化为管理员。我尝试遵循gsasl tests / gssapi.c中的测试代码,但是调用gsasl_step64()时,以下代码因GSASL_GSSAPI_INIT_SEC_CONTEXT_ERROR而失败。

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);
}

有人看到我在做什么错吗?

c linux active-directory sasl gssapi
1个回答
0
投票

答案不是很明确,因为我目前不使用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_COMPLETEGSS_S_CONTINUE_NEEDED。但是gss_init_sec_context()还有更多status codes。因此,我将更改库的代码并打印出更清晰的错误代码,为什么它不起作用。

[WINBIND / SAMBA中也有一个issue,不知道您是否使用SAMBA,它会在此特定函数中引发未指定的错误。

© www.soinside.com 2019 - 2024. All rights reserved.