在XP和Windows Server 2003使用凭据管理上


简介

  有时,应用程序要求有用户提供的凭据以便访问受保护的资源,如数据库或 FTP 网站。然而,获取并存储用户的 ID 和密码可能会给您的系统带来安全风险。如有可能,您根本不应该让用户提供凭据(例如,通过对数据库使用集成身份验证),但有时这无法避免。如果您确实要求用户提供凭据,并且您的应用程序将运行在 Microsoft Windows XP 或 Microsoft Windows Server 2003 上,则相应的操作系统会提供函数以使此任务变得容易一些。

 存储的用户名和密码

  Windows XP 和 Windows Server 2003 使用一种称为“存储的用户名和密码”的功能(参见图 1)将一组凭据与单个 Windows 用户帐户相关联,并使用数据保护 API (DPAPI) 来存储这些凭据。

图 1. Windows XP 中的 Credential Management 对话框

如果您的应用程序运行在 Windows XP 或 Windows .NET 上,则可以使用凭据管理 API 函数来提示用户输入凭据。这些 API 可以为您提供一致的用户界面(参见图 2),并使您可以自动支持由操作系统来缓存这些凭据。

在本文中,我将只是向您说明如何在 Microsoft Visual Basic .NET 和 C# 应用程序中使用凭据管理 API。

  在 .NET 中创建凭据 API 类

  声明 API 函数

  因为这些凭据管理函数是 Win32 API 调用,您将需要创建 extern (C#) 或 Declare (Visual Basic .NET) 定义以便访问它们。除了这些函数本身以外,还需要使用一些常数和结构来访问它们。这些常数被组织为预定义的常数组,所以我已经选择在 .NET 代码中以枚举形式实现这些常数组,以使 API 调用更加易于使用。

         Private Declare Unicode _
  Function CredUIPromptForCredentials _
  Lib "credui" Alias "CredUIPromptForCredentialsW" _
  (ByRef creditUR As CREDUI_INFO, _
  ByVal targetName As String, _
  ByVal reserved1 As IntPtr, _
  ByVal iError As Integer, _
  ByVal userName As StringBuilder, _
  ByVal maxUserName As Integer, _
  ByVal password As StringBuilder, _
  ByVal maxPassword As Integer, _
  ByRef iSave As Integer, _
  ByVal flags As CREDUI_FLAGS) _
  As CredUIReturnCodes
  Private Declare Unicode _
  Function CredUIParseUserName _
  Lib "credui" Alias "CredUIParseUserNameW" _
  (ByVal userName As String, _
  ByVal user As StringBuilder, _
  ByVal userMaxChars As Integer, _
  ByVal domain As StringBuilder, _
  ByVal domainMaxChars As Integer) _
  As CredUIReturnCodes
  Private Declare Unicode _
  Function CredUIConfirmCredentials _
  Lib "credui" Alias "CredUIConfirmCredentialsW" _
  (ByVal targetName As String, _
  ByVal confirm As Boolean) _
  As CredUIReturnCodes
  Public Declare Auto _
  Function DeleteObject Lib "Gdi32" _
  (ByVal hObject As IntPtr) As Boolean
  注:我在代码中包括了 GDI32 库中的 DeleteObject API 调用,因为如果您决定将自己的位图传递给 CredUIPromptForCredentials API,则您将需要使用该调用。当我在下文中演示自定义位图的使用时,您将可以了解该 API 的使用方法

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3