在我的代码中,我在尝试进行数据库连接之前,检查值是否为 NO_ERROR(可以将其更为确定地描述为 SUCCESS)。如果该 API 调用返回 NO_ERROR,但数据库连接失败,则我使用 ConfirmCredentials 调用通知凭据系统这些凭据无效,因而不应该保留。如果数据库连接成功,则我使用 ConfirmCredentials 调用通知凭据系统该用户 ID 和密码组合有效,并且应该保留。
Dim connString As String
Dim password, userid As String
Dim selectAuthors As String = _
"Select au_id, au_lname, au_fname From authors"
If result = CredUIReturnCodes.NO_ERROR Then
connString = String.Format( _
"Password={1};User ID={0};" & _
"Initial Catalog=pubs;" & _
"Data Source=MyServer", _
userid, password)
Dim conn As New SqlConnection(connString)
Try
conn.Open()
CredUI.ConfirmCredentials(host, True)
Catch sqlEx As SqlException
If sqlEx.Number = 18456 Then
MsgBox("Authentication Failed")
CredUI.ConfirmCredentials(host, False)
End If
Catch ex As Exception
MsgBox("Connection Error")
CredUI.ConfirmCredentials(host, False)
End Try
If conn.State = ConnectionState.Open Then
Dim cmdAuthors As New SqlCommand( _
selectAuthors, _
conn)
Dim daAuthors As New SqlDataAdapter(cmdAuthors)
Dim dtAuthors As New DataTable("Authors")
daAuthors.Fill(dtAuthors)
retrievedData.SetDataBinding(dtAuthors.DefaultView, "")
End If
ElseIf result <> CredUIReturnCodes.ERROR_CANCELLED Then
MsgBox("There was an error in authentication")
End If
使用自己的图形
图 3. 向标准凭据对话框中添加了自定义图形。
在您自己的代码中完成该操作相当容易,因为 System.Drawing.Bitmap 类提供了一个便利的方法 GetHbitmap 来获取基础图形的本机句柄。您需要创建 System.Drawing.Bitmap 的实例,然后将 CREDUI_INFO 结构的 .hbmBanner 成员设置为该位图的本机句柄。在使用完该 CREDUI_INFO 结构(已经对 PromptForCredentials 进行了调用)之后,需要释放该本机句柄,以避免任何形式的内存泄漏。要释放该句柄,需要使用另一个 API 调用,即 DeleteObject。我已经在我的 CredUI 类中包含了该 API 调用,以使自定义位图的使用变得尽可能地容易。
Dim credBmp As New Bitmap("d:\credui.bmp")
Dim info As New CREDUI_INFO()
With info
.hwndParent = Me.Handle
.pszCaptionText = host
.pszMessageText = _
String.Format("Please Enter Credentials for {0}", host)
.hbmBanner = credBmp.GetHbitmap()
End With
'make call to PromptForCredentials
'...
CredUI.DeleteObject(info.hbmBanner)
为了与 Windows 保持一致,建议您仍然使用默认图形,但能够在需要的时候自定义对话框也很不错。我从示例代码中的一个文件中加载了该图像,但如果您有这方面的爱好,也可以使用 GDI+ 临时绘制该图像。
小结
如果您需要提示用户输入数据库凭据、网站凭据或任何其他凭据组,则完成该任务的最佳方式是使用内置的操作系统功能。除了为用户提供一致的用户界面以外,您还可以因为操作系统缓存与已登录用户关联的凭据而受益