[英]Windows client application using GSSAPI/Kerberos API to authenticate through KDC
[英]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_COMPLETE
和GSS_S_CONTINUE_NEEDED
。 但是gss_init_sec_context()
有更多的狀態代碼。 所以我會更改庫的代碼並打印出更清晰的錯誤代碼,為什么它不起作用。
WINBIND/SAMBA 也有問題,不知道大家有沒有用過SAMBA,在這個特定的函數中拋出未指明的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.