除了通常由pGina在windows登录UI中提供的用户名和密码字段之外,我还需要有第三个文本字段。我将使用此字段接收一个密码,该密码将根据在后台运行的一次性密码服务进行检查。
如何在pGina登录UI中添加新字段并将其值传递给后台运行的服务?
任何帮助都是非常感谢的。
发布于 2018-10-10 16:38:28
我终于设法做到了这一点。
正如@Alexander所指出的,我编辑了TileUiLogon.h和TileUiTypes.h,并遵循模式将第三个字段添加到登录屏幕。然后,我编辑了Credential::Initialize并在" for“循环中添加了新的一行,与"password”字段的模式相同(我不确定那里到底发生了什么,但由于我们遵循现有的模式,只要新字段的内容是由类似于其他字段的代码收集的)。
因为我不想更改所有的函数签名和乱七八糟的代码,所以我只需编辑Credential::ProcessLoginAttempt函数,并将新字段的内容与密码字段的内容连接起来,并嵌入一个自定义分隔符,以便在以下步骤中分隔两个字符串。在点击submit按钮之后,字段数据在真正的序列化之前首先被发送到pGina服务正在侦听的管道(pGinaTransactions.cpp)。此服务将登录信息发送到其插件。然后,我编辑了已经提供的"Sample“插件,并将两个连接在一起的字符串分开,立即用用户提供的真实密码填充对象的password属性,因为这些数据将通过管道发送回凭证提供者进行进一步处理。如果插件返回成功,则密码将用于真正的序列化和登录尝试。
我可能遗漏了一些细节,欢迎您在评论中提问。
发布于 2018-09-25 22:48:26
我认为你必须修改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 },
}
};
}}
以及其他相关文件,如pGinaTransactions.h等,用于处理新字段。;-)
发布于 2018-09-25 20:25:00
据我所知(如果你使用的是Vista或更高版本),你必须创建your own Credential Provider并注册它。
对于与服务的交互,我会说这取决于它是在本地运行还是在远程服务器上运行。无论如何,这可能是工作中最容易的部分。
更新:我一点也不了解pGina。但是您应该查看对话框下面的gina.rc (第93行)。这似乎是一个有趣的起点。
尝试添加一个自定义的EDITEXT (顺便说一句,很多IDE很可能有一个用于这些资源的可视化工具。我知道Visual Studio就是其中之一,因为我已经经历过了。)
Visualizor and resource.h --> /!\这是它的外观和资源的屏幕截图。
//Third TEXTEDIT I just added
EDITTEXT IDC_CUSTOM_PASSWORD_TXT, 146, 88, 183, 12, ES_PASSWORD | ES_AUTOHSCROLLhttps://stackoverflow.com/questions/52478238
复制相似问题