簡體   English   中英

如何使用 gsasl gssapi 對 Active Directory 進行身份驗證?

[英]How to authenticate to Active Directory using gsasl gssapi?

我正在嘗試使用 gsasl 對 Active Directory 域進行身份驗證。 我已經 kinit'd 作為管理員。 我嘗試遵循 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);
}

有沒有人看到我做錯了什么?

不是一個明確的答案,因為我目前不使用 AD,所以我無法驗證我的答案。 但要本地化問題:

我會先嘗試這些例子 也許希望這個測試失敗。 如果它不適用於示例,我將調查 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()有更多的狀態代碼 所以我會更改庫的代碼並打印出更清晰的錯誤代碼,為什么它不起作用。

WINBIND/SAMBA 也有問題,不知道大家有沒有用過SAMBA,在這個特定的函數中拋出未指明的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM