【问题标题】:Adding a new text field pGina添加一个新的文本字段 pGina
【发布时间】:2019-02-27 21:37:02
【问题描述】:

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

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

感谢任何帮助。

【问题讨论】:

  • 请区分你在说什么:GinaCredential Provider?
  • @Alexander 是的,它与凭据提供程序有关。我需要知道的是我需要修改 pGina 源代码的哪一部分以在 Windows 登录屏幕上拥有第三个文本字段,以及如何使用从该文本字段接收到的数据。

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


【解决方案1】:

我终于做到了。

正如@Alexander 所指出的,我编辑了 TileUiLogon.h 和 TileUiTypes.h 并按照模式将第三个字段添加到登录屏幕。 然后,我编辑了 Credential::Initialize 并在“for”循环中添加了一个新行,遵循“密码”字段的相同模式(我不确定那里发生了什么,但因为我们遵守现有的模式,我们不关心,只要新字段的内容是由与其他字段类似的代码收集的)。

由于我不想更改所有函数签名并弄乱代码,我只是编辑了 Credential::ProcessLoginAttempt 函数并将新字段的内容与密码字段的内容连接起来并嵌入了自定义delimiter 允许我在以下步骤中分隔两个字符串。点击提交按钮后,在真正序列化之前,字段数据最初被发送到 pGina 服务正在侦听的另一端的管道 (pGinaTransactions.cpp)。该服务将登录信息发送到其插件。然后我编辑了已经提供的“Sample”插件并将两个连接的字符串分开,立即用用户提供的真实密码填充对象的密码属性,因为这些数据将通过管道发送回凭证提供者进行进一步处理.如果插件返回成功,则使用密码进行真正的序列化和登录尝试。

我可能遗漏了一些细节,非常欢迎您在 cmets 中提问。

【讨论】:

    【解决方案2】:

    我认为你必须修改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 等来处理新字段。 ;-)

    【讨论】:

    • 谢谢。我曾经沿着这条路走,我无法得到结果。虽然我要再试一次,看看这次我能不能让它工作。谢谢,非常感谢您的帮助。
    【解决方案3】:

    据我所知(如果您使用的是 Vista 或更高版本),您必须创建 your own Credential Provider 并注册它。

    对于与服务的交互,我想说这取决于它是在本地服务器上还是在远程服务器上运行。无论如何,这可能是工作中最简单的部分。

    更新:我一点也不了解 pGina。但是您应该查看 DIALOGS 下的 gina.rc(第 93 行)。似乎是一个有趣的起点。

    尝试添加自定义 EDITEXT(顺便说一下,很多 IDE 很可能都有这些资源的可视化工具。我知道 Visual Studio 就是其中之一,因为我已经体验过它。)

    Visualizor and resource.h --> /!\ 这是它的外观和resource.h的屏幕截图。

    //Third TEXTEDIT I just added
    EDITTEXT        IDC_CUSTOM_PASSWORD_TXT, 146, 88, 183, 12, ES_PASSWORD | ES_AUTOHSCROLL
    

    【讨论】:

    • 谢谢。这就是我尝试使用 pGina 的原因,它已经实现了凭证提供程序。我希望修改代码以满足我的需要,但我很困惑要操作源代码的哪一部分。
    • 感谢您的更新。但是,正如@Alexander 指出的那样,我相信文件 TileUiLogon.h 是我们应该开始的文件。
    • 是的。这个是用于 SAS 键投掷的,不是正确地说的瓷砖。让我知道你是否成功。我会高兴地睁大眼睛。
    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 2015-08-22
    • 1970-01-01
    • 2019-02-13
    • 2012-03-25
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多