登录方法使用GINA进行自定义

我知道在GINA中找到一个主人并不容易,但我的问题是最接近进程间通信(IPC),我在非托管c ++中编写了我的自定义GINA,我在其中包含了一个检查用户指纹有效性的方法尝试要登录,这个函数会在用c#编写的运行系统windows服务中调用一些方法,代码如下:

在GINA中,非托管c ++

if(Fingerprint.Validate(userName,finerprintTemplate) { //perform login } 

在Windows服务中,C#

 public class Fingerprint { public static bool Validate(string userName, byte[] finerprintTemplate) { //Preform Some code to validate fingerprintTemplate with userName //and retuen result } } 

有没有人知道如何在GINA和Windows服务之间进行这种通信,或者只是在c ++编写的服务和C#编写的服务之间进行。

谢谢

用于与服务(或可能需要跨越会话/桌面边界的大多数IPC)通信的规范方法是命名管道。 您也可以使用邮件槽,但是您必须处理重复问题,因为邮件邮件会在所有已安装的协议中被欺骗,因此您需要某种标记系统……变得有点混乱。

查看CreateNamedPipe的文档并从那里开始工作。 我已经使用管道在C ++和C#之间进行了讨论:interop有点乱(二进制消息),但它可以做到。 这里有一些C#管道的示例代码(来自两侧)。

使用管道为您的特定服务提供服务通信问题的好处是您可以稍后扩展设计以在需要时支持UI。

NISGINA是一个开源的GINA插件,可以根据NIS目录进行身份validation。 如果你还没有看到这个,那就是我所知道的开源GINA插件的唯一例子。 如果您还没有,您可能会发现值得您仔细阅读源代码。

请注意,从Windows Vista开始, GINA已被弃用 ,并被另一个名为Credential Provider Architecture的 API取代。

我强烈建议您使用命名管道。 如果您使用.Net 3.5或更高版本,它们在C#方面快速,易于使用,而且从C ++方面来说相对容易(有大量示例可用)。 最重要的是,通过应用简单的安全描述符非常容易保护。

我很好奇你是否按照建议的“答案”并尝试了命名管道路线? 根据这个链接和我自己的经验,GINA在预先认证(会话0)上下文中运行,任何从非托管C ++ GINA dll访问命名管道的尝试都将导致错误#5“访问被拒绝”。

我相信Mailslots可能是该级别实际可用的唯一可用的Windows IPC机制,但我甚至不确定它是否可行(尚未尝试过。)