添加一个新的文本字段pGina

时间:2018-09-24 11:21:28

标签: windows one-time-password winlogon credential-providers

除了Windows登录UI中pGina通常提供的“用户名”和“密码”字段外,我还需要第三个文本字段。我将使用此字段接收密码,以便在后台运行的一次性密码服务进行检查。

如何在pGina登录UI中添加新字段并将其值传递给在后台运行的服务?

感谢您的帮助。

3 个答案:

答案 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