使用 windows vista 的凭据提供程序创造自定义的登录体验

上传人:wt****50 文档编号:34268945 上传时间:2018-02-22 格式:DOCX 页数:18 大小:78.09KB
返回 下载 相关 举报
使用 windows vista 的凭据提供程序创造自定义的登录体验_第1页
第1页 / 共18页
使用 windows vista 的凭据提供程序创造自定义的登录体验_第2页
第2页 / 共18页
使用 windows vista 的凭据提供程序创造自定义的登录体验_第3页
第3页 / 共18页
使用 windows vista 的凭据提供程序创造自定义的登录体验_第4页
第4页 / 共18页
使用 windows vista 的凭据提供程序创造自定义的登录体验_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《使用 windows vista 的凭据提供程序创造自定义的登录体验》由会员分享,可在线阅读,更多相关《使用 windows vista 的凭据提供程序创造自定义的登录体验(18页珍藏版)》请在金锄头文库上搜索。

1、桌面安全使用 Windows Vista 的凭据提供程序创造自定义的登录体验Dan Griffin本文讨论: 新的凭据提供程序体系结构 为什么弃用了基于 GINA 的身份验证 多因素 (Multi-factor) 身份验证 开发和调试凭据提供程序本文使用了以下技术: Windows Vista、C+目录 新旧两种体系结构的比较 混合凭据提供程序 要求 设计 混合凭据提供程序 混合方式的实现 改进的可能性 测试和调试 智能卡和初始化 Windows Vista 在平台集成方面为开发人员提供了许多新的机会。新的凭据提供程序模型是变动最大的方面之一,由于它的出现,实现操作系统支持的新用户身份验证方案

2、变得容易 了许多。它已取代了 GINA(图形标识与身份验证)模型,而直言不讳地说,后者一向因为开发人员难以理解和实现以及昂贵的 Microsoft 支持费用而广为诟病。那么 Windows 登录插件接口的一个变化竟会如此令人兴奋,其原因何在?用户打开计算机时首先看到的是登录屏幕。由于登录体验是由凭据提供程序来控制和管理的,这使得自定 义登录体验以及集成最符合组织需要的身份验证方法变得容易了许多。简而言之,凭据提供程序为开发和实现更好、更可靠的安全性提供了一种更容易的方式。新旧两种体系结构的比较我不想过细地阐述基于 GINA 的登录体系结构。不过,花点时间比较一下这两个体系结构,帮助您更好地理解

3、新的体系结构以及其中的变动,这也很值当。在 Windows Vista 之前的环境中,每个会话都有一个 winlogon 实例,它负责控制该会话的交互式登录序列。(图 1 显示了 Windows XP 和 Windows Server 2003 旧的登录体系结构。)在刚启动的系统中,控制台位置的交互式登录始终在会话 0 中执行。会话 0 承载运行系统服务以及其他关键进程,包括“本地安全机构”(Local Security Authority) 进程。(换句话说,在会话 0 中运行的许多进程都没有在图 1 中显示出来。)图 1 GINA 登录体系结构 计算机上已注册的 GINA 加载到 winl

4、ogon 进程空间中。(还可能加载一个称作“GINA 链接”的配置,但测试和支持这样的复杂配置很困难。)最后,GINA 调用 LogonUser 以及相关的身份验证 API。在 Windows Vista 中,会话 0 不再用于交互式登录(请参见图 2)。这有利于提高安全性,因为现在已有一个会话边界将所有的计算机进程与各个用户的进程分隔开来。此外,现在对内核全局命名空间的控制也更加严格,因为默认情况下由用户应用程序创建的对象已不在内核全局命名空间之内。图 2 新的登录体系结构 除会话 0 之外的每一个会话仍会有一个 winlogon 实例。图 2 显示,系统中已注册了几个凭据提供程序,并已通过

5、新的 LogonUI 进程加载。在由哪个组件负责显示登录图形界面方面也有一个重要的改动。以前,这是由 GINA 来处理的,因此,显示界面的工作可能一直由第三方组件来完成。在新的体系结构中,这是由操作系统的一个内置组件 LogonUI 来负责完成的。那 么每个提供程序的用户提示行为在新的模型中是如何实现的呢?“凭据提供程序”体系结构要求每个提供程序都要列举说明它所需要的 UI 元素。例如,在某个指定的方案中,提供程序可能会向 LogonUI 表明它需要两个编辑框、两个标题、一个复选框和一个位图。然后,LogonUI 为凭据提供程序显示这些控件。这对实现以前讨论的目标大有帮助,即用一致的外观和方法

6、来广泛支持不断修改完善的用户验证方案。负 责“凭据提供程序”开发的 Microsoft 开发团队原以为外部开发人员会更愿意基于 COM 来开发插件模型。然而,在 Windows Vista 开发周期的早期阶段,新接口最初的内部设计(类似于 GINA)完全基于 LoadLibrary 和函数指针。之后,基于 COM 的重新设计吸取了第一次的教训,使得设计出来的界面更加简洁和易用。 现在我们转到示例代码,来帮助引导我们深入了解凭据提供程序接口。 混合凭据提供程序此新插件模型的计时功能臻于完美(当然,或许早就应该有这样的功能了)。现在,开发人员可以更轻松地满足多因素身份验证方案需求,同时提供与 Mi

7、crosoft 原有的相一致的登录体验。尽 管如此,新的接口仍显得相当抽象。有关它的描述说明也同样令人费解,让人感到乏味!要想了解它,一个让人能提起兴趣的方式就是体验一下新凭据提供程序的设 计、开发和测试过程。而且,这可以很好地弥补 Microsoft 提供的现有文档的不足 有关指针方面的内容,请参阅侧栏“其他资源”。我创建了一个示例,即“混合凭据提供程序”,它会演示一些全新的功能。混合凭据提供程序允许将用户名、密码和域名存储在智能卡上。插入智能卡后,用户会自动登录。(可从MSDN 杂志网站下载示例代码。)我没有重新编写代码,而是将以下三个来源的代码合在一起: Microsoft Window

8、s SDK 中提供的基于密码的凭据提供程序示例。 以前的 PropCert 示例,同样来自 SDK。其核心是一个用于读取基于证书的智能卡凭据的 Win32 线程。 我的文章(刊载于 2006 年 11 月发行的MSDN 杂志)中包含的示例代码。这篇文章讨论了如何通过托管代码与 Windows 智能卡子系统建立接口。对 于我在 2006 年 11 月发表的那篇文章中所提供的示例代码,我需要作进一步的说明。凭据提供程序体系结构及其主机只支持本机代码。尽管我的第一篇文章讲的主要是托管代码,但其 中也包含了一个本机帮助程序 DLL,以便于公开新的智能卡模块接口。混合凭据提供程序便基于这个帮助程序 DL

9、L。如需该 DLL 的完整源代码,同样可以通过 2006 年 11 月发表的那篇文章随附的下载内容中获得。总之,混合凭据提供程序的代码中有很大一部分都不是新写的。其最终结果是将测试和调试时间减到最少。实际上,核心调试阶段花费了不到一天的时间,这证明了新接口的易用性。现在详细地讨论一下我使用此示例凭据提供程序所要执行的操作。 要求构思此混合凭据提供程序时,我希望达到以下这些要求: 使之基于智能卡运行 最大限度地增加代码的重用 最大限度地减少额外配置和基础结构需求因 此我采用了我的所谓混合方法,换言之就是密码(为了安全起见)加智能卡(为了方便起见)。由于混合提供程序的概念是基于用户名和密码的,因此

10、我将从 Platform SDK 分离出来的密码提供程序示例作为我设计该方法的起点。然后,我添加了来自 SDK 的 PropCert 示例;其中包括了用于枚举智能卡读卡器、卡和数字证书的逻辑过程。我觉得我要做的就是,将 PropCert 中基于证书的逻辑代码替换为用于读取我自己的凭据数据的一些新代码,然后简单地将这两个示例连在一起就可以了!由于我们将从智能卡读取密码登录信息,这意味着还有一个需求:一个使用该凭据初始化智能卡的工具。初始化工具将放在最后讨论。根据这些要求,我们来看一看凭据提供程序体系结构的设计以及它如何影响我的示例代码设计。设计我们先从运行时凭据提供程序的角度来讨论一下凭据提供程

11、序体系结构的设计。虽 然我尚未详细讨论混合示例,但我将使用它作为分析运行中的新凭据提供程序体系结构的基础。为了便于讨论,我的示例代码包含了调试跟踪。此跟踪包含从每个已 实现的凭据提供程序例程进行的 OutputDebugString 调用。在这些跟踪调用中,我使用两个缩写。对新的 ICredentialProvider 接口(请参见图 3)的调用以“Provider:” 开头。对 ICredentialProviderCredential 接口(请参见图 4)的调用以“Credential:”开头。请注意,所有凭据提供程序相关接口都是在新的公共头文件 credentialprovider.h

12、中定义的。Figure 4 ICredentialProviderCredential 接口 ICredentialProviderCredential : public IUnknownHRESULT STDMETHODCALLTYPE Advise( /* in */ ICredentialProviderCredentialEvents *pcpce);HRESULT STDMETHODCALLTYPE UnAdvise( void);HRESULT STDMETHODCALLTYPE SetSelected( /* out */ BOOL *pbAutoLogon);HRESULT S

13、TDMETHODCALLTYPE SetDeselected( void);HRESULT STDMETHODCALLTYPE GetFieldState( /* in */ DWORD dwFieldID,/* out */ CREDENTIAL_PROVIDER_FIELD_STATE *pcpfs,/* out */ CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE *pcpfis);HRESULT STDMETHODCALLTYPE GetStringValue( /* in */ DWORD dwFieldID,/* stringout */ L

14、PWSTR *ppsz);HRESULT STDMETHODCALLTYPE GetBitmapValue( /* in */ DWORD dwFieldID,/* out */ HBITMAP *phbmp);HRESULT STDMETHODCALLTYPE GetCheckboxValue( /* in */ DWORD dwFieldID,/* out */ BOOL *pbChecked,/* stringout */ LPWSTR *ppszLabel);HRESULT STDMETHODCALLTYPE GetSubmitButtonValue( /* in */ DWORD d

15、wFieldID,/* out */ DWORD *pdwAdjacentTo);HRESULT STDMETHODCALLTYPE GetComboBoxValueCount( /* in */ DWORD dwFieldID,/* out */ DWORD *pcItems,/* out */ DWORD *pdwSelectedItem);HRESULT STDMETHODCALLTYPE GetComboBoxValueAt( /* in */ DWORD dwFieldID,DWORD dwItem,/* stringout */ LPWSTR *ppszItem);HRESULT

16、STDMETHODCALLTYPE SetStringValue( /* in */ DWORD dwFieldID,/* stringin */ LPCWSTR psz);HRESULT STDMETHODCALLTYPE SetCheckboxValue( /* in */ DWORD dwFieldID,/* in */ BOOL bChecked); HRESULT STDMETHODCALLTYPE SetComboBoxSelectedValue( /* in */ DWORD dwFieldID,/* in */ DWORD dwSelectedItem);HRESULT STDMETHODCALLTYPE CommandLinkClicked( /* in */ DWORD dwFieldID);HRESULT STDMET

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号