使用 ADsOpenObject 和 IADsOpenDSObject::OpenDSObject 进行绑定
ADsOpenObject 函数和 IADsOpenDSObject::OpenDSObject 方法可用于在必须指定备用凭据和要求进行数据加密时绑定到目录服务对象。
应尽可能使用调用线程的凭据。 但是,如果必须使用备用凭据,则必须使用 ADsOpenObject 函数或 IADsOpenDSObject::OpenDSObject 方法。 如果使用了备用凭据,则切勿缓存密码。 可通过为第一个绑定操作指定用户名和密码,然后在后续绑定中仅指定用户名来执行多个绑定操作。 只要满足以下条件,系统便会在第一次调用时设置会话,并在后续绑定调用时使用同一会话:
- 每个绑定操作中的用户名相同。
- 在每个绑定操作中实现无服务器绑定或绑定到同一服务器。
- 通过保留其中一个绑定操作中的对象引用来保持打开的会话。 释放最后一个对象引用后,此会话将关闭。
ADsOpenObject 和 IADsOpenDSObject::OpenDSObject 使用 Windows NT 安全支持提供程序接口 (SSPI) 来灵活地使用身份验证选项。 使用这些接口的主要好处是向 Active Directory 客户端提供不同类型的身份验证,并加密会话。 目前,ADSI 不允许传入证书。 因此,可使用 SSL 进行加密,然后使用 Kerberos、NTLM 或简易身份验证,具体取决于如何对 dwReserved 参数设置这些标记。
无法在 ADSI 中请求特定 SSPI 提供程序,虽然始终会获得最高的首选项协议。 对于绑定到运行 Windows 的计算机的 Windows 客户端,此协议为 Kerberos。 对于网页,则支持不允许使用证书进行身份验证,因为身份验证是在运行该网页之前进行。
虽然 Open 操作允许指定用户和密码,但不应这样做。 相反,不应指定任何凭据,并隐式使用调用方的安全上下文的凭据。 若要通过 ADsOpenObject 或 IADsOpenDSObject::OpenDSObject 并使用调用方的凭据绑定到目录对象,则应为用户名和密码同时指定 NULL
。
最后,若要绑定而不进行身份验证,则请使用 ADS_NO_AUTHENTICATION 标记。 无身份验证表示 ADSI 会尝试作为匿名用户绑定到目标对象,且不执行任何身份验证。 这相当于在 LDAP 中请求匿名绑定,并表示所有用户均包含在安全上下文中。
如果将这些身份验证标记设为零,ADSI 则会执行以纯文本形式发送的简易绑定。
注意
如果在未指定身份验证标记的情况下指定用户名和密码,则会将此用户名和密码以纯文本形式通过网络进行传输,而这会构成安全风险。 请勿在未指定身份验证标记的情况下指定用户名和密码。
示例
以下 Visual Basic 代码示例演示了如何使用 IADsOpenDSObject::OpenDSObject 方法。
Const ADS_SECURE_AUTHENTICATION = 1
Dim openDS As IADsOpenDSObject
Dim usr As IADsUser
Set openDS = GetObject("LDAP:")
openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
vbNullString,
vbNullString,
ADS_SECURE_AUTHENTICATION)
以下 C++ 代码示例演示了如何使用 ADsOpenObject 函数。
IADs *pObject;
HRESULT hr;
hr = ADsOpenObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pObject);
if(SUCCEEDED(hr))
{
// Use the object.
// Release the object.
pObject->Release()
}
IADsOpenDSObject 接口也可在 C++ 中使用,但它会与 ADsOpenObject 函数重复。
以下 C++ 代码示例演示了如何使用 IADsOpenDSObject 接口来执行与以上代码示例中相同的绑定操作。
IADsOpenDSObject *pDSO;
HRESULT hr;
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**)&pDSO);
if(SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = pDSO->OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
&pDisp);
if(SUCCEEDED(hr))
{
IADs *pObject;
hr = pDisp->QueryInterface(IID_IADs, (void**) &pObject);
if(SUCCEEDED(hr))
{
// Use the object.
// Release the object.
pObject->Release();
}
pDisp->Release();
}
pDSO->Release();
}