旧版应用程序的PAM认证
|
我有一个旧版应用程序,该应用程序通过网络异步接收用户名/密码请求。由于我已经将用户名和密码存储为变量,因此在Linux(Debian 6)上通过PAM进行身份验证的最佳方法是什么?
我曾尝试编写自己的对话功能,但不确定将密码输入其中的最佳方法。我已经考虑过将其存储在appdata中,并从pam_conv结构中引用它,但是几乎没有关于该操作的文档。
有没有一种简单的方法来对用户进行身份验证而又不会过度使用对话功能?我也无法成功使用pam_set_data,我不确定这是否合适。
这是我正在做的事情:
user = guiMessage->username;
pass = guiMessage->password;
pam_handle_t* pamh = NULL;
int pam_ret;
struct pam_conv conv = {
my_conv,
NULL
};
pam_start(\"nxs_login\", user, &conv, &pamh);
pam_ret = pam_authenticate(pamh, 0);
if (pam_ret == PAM_SUCCESS)
permissions = 0xff;
pam_end(pamh, pam_ret);
最初尝试使用对话功能导致(密码经过硬编码以进行测试):
int
my_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *data)
{
struct pam_response *aresp;
if (num_msg <= 0 || num_msg > PAM_MAX_NUM_MSG)
return (PAM_CONV_ERR);
if ((aresp = (pam_response*)calloc(num_msg, sizeof *aresp)) == NULL)
return (PAM_BUF_ERR);
aresp[0].resp_retcode = 0;
aresp[0].resp = strdup(\"mypassword\");
*resp = aresp;
return (PAM_SUCCESS);
}
任何帮助,将不胜感激。谢谢!
没有找到相关结果
已邀请:
3 个回复
茶鬼失形
肺鬼耙扮群
这将使密码可以在堆栈上提供给任何希望使用它的模块,但是通常您必须通过在服务的pam_configuration中设置标准use_first_pass或try_first_pass选项来告诉该模块使用该密码(在本例中为/ etc /pam.d/common-auth)。 标准的pam_unix模块确实支持try_first_pass,因此将其添加到系统的pam配置中(在pam_unix行的末尾)不会有任何问题。 执行完此操作后,从common-auth服务调用的对pam_authenticate()的任何调用都应该只提取密码并随身携带。 关于use_first_pass和try_first_pass之间的区别的一个小说明:它们都告诉模块(在本例中为pam_unix)尝试在pam_stack上输入密码,但是在没有密码/ AUTHTOK可用时,它们的行为有所不同。在缺少的情况下,use_first_pass失败,而try_first_pass允许模块提示输入密码。
辩谷变充