Obtaining Alternate Digest Credentials
To obtain credentials other than those associated with the current logon session, populate a SEC_WINNT_AUTH_IDENTITY structure with information for the alternate security principal. Pass the structure to the AcquireCredentialsHandle function using the pAuthData parameter.
The following table describes the members of the SEC_WINNT_AUTH_IDENTITY structure.
Member | Description |
---|---|
User | Null-terminated string containing the name of the security principal whose credentials will be used to establish a security context. |
UserLength | The length of the User member, in characters. Omit the terminating null. |
Domain | Null-terminated string that identifies the domain containing the account of the security principal. |
DomainLength | The length of the Domain member, in characters. Omit the terminating null. |
Password | Null-terminated string containing the password of the security principal. |
PasswordLength | The length of the Password member, in characters. Omit the terminating null. |
Flags | Indicates whether the string members are in ANSI or Unicode format. |
The following table lists the valid values for the Flags member of the structure.
Constant | Description |
---|---|
SEC_WINNT_AUTH_IDENTITY_ANSI | Strings in this structure are in ANSI format. |
SEC_WINNT_AUTH_IDENTITY_UNICODE | Strings in this structure are in Unicode format. |
The structure and constants are declared in the Rpcdce.h header file distributed with the Platform Software Development Kit (SDK).
The following example demonstrates a client-side call to obtain Digest credentials for a specific user account.
#include <windows.h>
#ifdef UNICODE
ClientAuthID.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
#else
ClientAuthID.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
#endif
void main()
{
SECURITY_STATUS SecStatus;
TimeStamp tsLifetime;
CredHandle hCred;
SEC_WINNT_AUTH_IDENTITY ClientAuthID;
LPTSTR UserName = TEXT("ASecurityPrinciple");
LPTSTR DomainName = TEXT("AnAuthenticatingDomain");
// Initialize the memory.
ZeroMemory( &ClientAuthID, sizeof(ClientAuthID) );
// Specify string format for the ClientAuthID structure.
// Specify an alternate user, domain and password.
ClientAuthID.User = (unsigned char *) UserName;
ClientAuthID.UserLength = _tcslen(UserName);
ClientAuthID.Domain = (unsigned char *) DomainName;
ClientAuthID.DomainLength = _tcslen(DomainName);
// Password is an application-defined LPTSTR variable
// containing the user password.
ClientAuthID.Password = Password;
ClientAuthID.PasswordLength = _tcslen(Password);
// Get the client side credential handle.
SecStatus = AcquireCredentialsHandle (
NULL, // Default principal.
WDIGEST_SP_NAME, // The Digest SSP.
SECPKG_CRED_OUTBOUND, // Client will use the credentials.
NULL, // Do not specify LOGON id.
&ClientAuthID, // User information.
NULL, // Not used with Digest SSP.
NULL, // Not used with Digest SSP.
&hCred, // Receives the credential handle.
&tsLifetime // Receives the credential time limit.
);
}
The _tcslen function returns the string length in characters, not including the terminating null character.
If your application can use the credentials established at logon, see Obtaining Default Digest Credentials.