除了Windows登录UI中pGina通常提供的“用户名”和“密码”字段外,我还需要第三个文本字段。我将使用此字段接收密码,以便在后台运行的一次性密码服务进行检查。
如何在pGina登录UI中添加新字段并将其值传递给在后台运行的服务?
感谢您的帮助。
答案 0 :(得分:1)
我认为您必须修改TileUiLogon.h文件:
namespace pGina
{
namespace CredProv
{
// Fields for unlock and logon:
typedef enum LOGON_UI_FIELD_ID
{
LUIFI_TILEIMAGE = 0,
LUIFI_MOTD = 1,
LUIFI_USERNAME = 2,
LUIFI_PASSWORD = 3,
LUIFI_OTP = 4,
LUIFI_SUBMIT = 5,
LUIFI_STATUS = 6,
LUIFI_NUM_FIELDS = 7,
};
static const UI_FIELDS s_logonFields =
{
LUIFI_NUM_FIELDS, // Number of fields total
LUIFI_PASSWORD, // Field index which submit button should be adjacent to
LUIFI_USERNAME, // Username field index value
LUIFI_PASSWORD, // Password field index value
LUIFI_STATUS, // Status field
{
// when to display, style, field id, type, name data source value callback
{ { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, { LUIFI_TILEIMAGE, CPFT_TILE_IMAGE, L"Image" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, { LUIFI_MOTD, CPFT_SMALL_TEXT, L"MOTD" }, SOURCE_DYNAMIC, L"pGina", NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED }, { LUIFI_USERNAME, CPFT_EDIT_TEXT, L"Username" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_NONE }, { LUIFI_PASSWORD, CPFT_PASSWORD_TEXT, L"Password" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_NONE }, { LUIFI_OTP, CPFT_PASSWORD_TEXT, L"OTP" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_NONE }, { LUIFI_SUBMIT, CPFT_SUBMIT_BUTTON, L"Submit" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, { LUIFI_STATUS, CPFT_SMALL_TEXT, L"Status" }, SOURCE_STATUS, L"Status", NULL },
}
};
}
static const UI_FIELDS s_logonFields =
{
LUIFI_NUM_FIELDS, // Number of fields total
LUIFI_PASSWORD, // Field index which submit button should be adjacent to
LUIFI_USERNAME, // Username field index value
LUIFI_PASSWORD, // Password field index value
LUIFI_STATUS, // Status field
{
// when to display, style, field id, type, name data source value callback
{ { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, { LUIFI_TILEIMAGE, CPFT_TILE_IMAGE, L"Image" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, { LUIFI_MOTD, CPFT_SMALL_TEXT, L"MOTD" }, SOURCE_DYNAMIC, L"pGina", NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_FOCUSED }, { LUIFI_USERNAME, CPFT_EDIT_TEXT, L"Username" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_NONE }, { LUIFI_PASSWORD, CPFT_PASSWORD_TEXT, L"Password" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_NONE }, { LUIFI_OTP, CPFT_PASSWORD_TEXT, L"OTP" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_SELECTED_TILE, CPFIS_NONE }, { LUIFI_SUBMIT, CPFT_SUBMIT_BUTTON, L"Submit" }, SOURCE_NONE, NULL, NULL },
{ { CPFS_DISPLAY_IN_BOTH, CPFIS_NONE }, { LUIFI_STATUS, CPFT_SMALL_TEXT, L"Status" }, SOURCE_STATUS, L"Status", NULL },
}
};
}
和其他相关文件(如pGinaTransactions.h等)来处理新字段。 ;-)
答案 1 :(得分:1)
我终于设法做到了。
正如@Alexander指出的那样,我编辑了TileUiLogon.h和TileUiTypes.h,并按照该模式在登录屏幕上添加了第三个字段。 然后,我编辑了Credential :: Initialize并在“ for”循环中添加了新行,并遵循与“ password”字段相同的模式(我不确定那里到底发生了什么,但是由于我们遵守现有的模式,只要新字段的内容由与其他字段类似的代码收集,我们就不在乎。
由于我不想更改所有功能签名并弄乱代码,因此我只编辑了Credential :: ProcessLoginAttempt函数,并将新字段的内容与password字段的内容串联在一起,并嵌入了自定义分隔符,使我可以在以下步骤中将两个字符串分开。点击提交按钮后,在实际序列化之前,字段数据首先发送到pGina服务正在侦听的另一端的管道(pGinaTransactions.cpp)。该服务将登录信息发送到其插件。然后,我编辑了已经提供的“ Sample”插件,并分离了两个串联的字符串,立即用用户提供的真实密码填充了对象的password属性,因为这些数据将通过管道发送回凭证提供者以进行进一步处理。如果插件返回成功,则密码将用于实际的序列化和登录尝试。
我可能错过了一些细节,非常欢迎您在评论中提出这些问题。
答案 2 :(得分:0)
据我所知(如果您使用的是Vista或更高版本),则必须制作your own Credential Provider并进行注册。
对于与服务的交互,我想说这取决于它是在本地还是在远程服务器上运行。无论如何,这可能是工作的简单部分。
更新:我完全不了解pGina。但是您应该查看 DIALOGS 下的gina.rc(第93行)。似乎是一个有趣的起点。
尝试添加自定义EDITEXT(顺便说一下,很多IDE很可能为这些资源提供了一个可视化工具。我知道Visual Studio是我已经体验过的其中一个。)
Visualizor and resource.h-> /!\这是它的外观和资源的屏幕截图。h。
//Third TEXTEDIT I just added
EDITTEXT IDC_CUSTOM_PASSWORD_TXT, 146, 88, 183, 12, ES_PASSWORD | ES_AUTOHSCROLL