quiero validar un conjunto de credenciales contra el controlador de dominio. ej .:¿Cómo validar las credenciales de dominio (del código nativo)?
Username: joel
Password: splotchy
Domain: STACKOVERFLOW
En .NET 3.5 y versiones posteriores you can use PrincipalContext.ValidateCredentials(username, password)
.
De lo contrario, estás en problemas.
Siguiendo el código en el artículo How to validate user credentials on Microsoft operating systems Microsoft Knowledge Base, llego al punto en el que se llama a AcceptSecurityContext
:
ss = AcceptSecurityContext(
@pAS._hcred, //[in]CredHandle structure
phContext, //[in,out]CtxtHandle structure
@InBuffDesc, //[in]SecBufferDesc structure
0, //[in]context requirement flags
SECURITY_NATIVE_DREP, //[in]target data representation
@pAS._hctxt, //[in,out]CtxtHandle strcture
@OutBuffDesc, //[in,out]SecBufferDesc structure
ContextAttributes, //[out]Context attribute flags
@Lifetime); //[out]Timestamp struture
excepto que la función falla con:
SEC_E_NO_AUTHENTICATING_AUTHORITY
(0x80090311)La función ha fallado. No se pudo contactar a ninguna autoridad para la autenticación. Esto podría deberse a las siguientes condiciones:
- El nombre de dominio de la parte que realiza la autenticación es incorrecto.
- El dominio no está disponible.
- La relación de confianza ha fallado.
Esto sería un error útil, excepto que yo pueda validar las mismas credenciales de .NET 3.5 usando:
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain))
{
valid = context.ValidateCredentials(username, password);
}
Qué podría estar sucediendo que permite .NET para validar un conjunto de credenciales , mientras que el código nativo no puede?
actualización: LogonUser
también falla:
LogonUser("[email protected]", null, "splotchy",
LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token);
con
1311 - There are currently no logon servers available to service the logon request
actualizar dos: He intentado tanto el Negotiate
de proveedores preferidos, así como TH correo de Windows NT4 legado "NTLM" proveedor de
String package = "Negotiate"; //"NTLM"
QuerySecurityPackageInfo(package, [out] packageInfo);
...
AcquireCredentialsHandle(
null, //[in] principle
package, //[in] package
SECPKG_CRED_OUTBOUND, //[in] credential use
null, //[in] LogonID
pAuthIdentity, //[in] authData
null, //[in] GetKeyFn, not used and should be null
null, //[in] GetKeyArgument, not used and should be null
credHandle, //[out] CredHandle structure
expires); //[out] expiration TimeStamp structure
¿Cómo se llama 'InitializeSecurityContext'? (¿Qué SSP, en particular?) ¿Cómo está configurando el 'CredHandle'? –
@EdwardThomson He intentado el proveedor 'Negociar' preferido, así como' NTLM'. El 'CredHandle' se inicializa mediante una llamada a' AcquireCredentialsHandle'. –
Parece que recuerdo haber tenido un problema similar, aunque esto fue hace años y el problema es confuso. ¿Hay algún cambio si ejecuta w/permisos elevados? (Dominio de administrador tal vez?) –