【问题标题】:How to authenticate to Active Directory using gsasl gssapi?如何使用 gsasl gssapi 对 Active Directory 进行身份验证?
【发布时间】:2020-06-26 12:19:07
【问题描述】:

我正在尝试使用 gsasl 对 Active Directory 域进行身份验证。我已经成为管理员了。我尝试按照 gsasl 测试/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】:

    不是很明确的答案,因为我目前不使用 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没有,在这个具体函数中会抛出未指定的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多