c# - Desambiguación del dominio PrincipalContext.ValidateCredentials de Active Directory
active-directory multiple-domains (4)
Estoy lidiando con dos dominios: uno es un dominio de confianza. Puede haber un JohnSmith en un dominio y otro JohnSmith en el otro. Ambas personas necesitan iniciar sesión en mi aplicación.
Mi problema: no importa en qué dominio paso: ¡este código devuelve verdadero! ¿Cómo sé que John Smith está iniciando sesión?
static public bool CheckCredentials(
string userName, string password, string domain)
{
using (var context = new PrincipalContext(ContextType.Domain, domain))
{
return context.ValidateCredentials(userName, password);
}
}
En base a la respuesta de JPBlanc, he vuelto a escribir mi código. También agregué un try / catch en caso de que se pase un dominio falso.
static public bool CheckCredentials(
string userName, string password, string domain)
{
string userPrincipalName = userName + "@" + domain + ".com";
try
{
using (var context = new PrincipalContext(ContextType.Domain, domain))
{
return context.ValidateCredentials(userPrincipalName, password);
}
}
catch // a bogus domain causes an LDAP error
{
return false;
}
}
ValidateCredentials
funciona con userPrincipalName
, quizás pueda intentar crear el primer parámetro (nombre de usuario) combinando el inicio de sesión y el dominio para crear el nombre de usuario [email protected]
frente a [email protected]
.
La respuesta aceptada fallará con Dominios que contengan diferentes direcciones de correo electrónico dentro de ellos. Ejemplo:
Domain = Company
User1 = [email protected] (under company Domain)
User2 = [email protected] (under company Domain)
La respuesta provista devolverá falso usando:
userName = "employee";
domain = "company";
string userPrincipalName = userName + "@" + domain + ".com";
La forma correcta de abarcar usuarios en todos los dominios es:
string userPrincipalName = userName + "@" + domain;
sin la porción .com, busca al usuario en ese dominio en lugar de buscar un correo electrónico dentro de un dominio global.
Siempre puedes recuperar el DN completo del usuario que ha iniciado sesión usando
UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, userName);
up.UserPrincipalName // shows [email protected]
up.DistinguishedName // shows CN=Surname,OU=group,DC=domain,DC=com
up.SamAccountName // shows login name
Use up.SamAccountName para realizar llamadas posteriores a ValidateCredentials, incluido el nombre de dominio. ¡No puede tener 2 usuarios que inicien sesión con el mismo nombre de cuenta de SAMA!
DistinguishedName definitivamente le mostrará qué sesión inició JohnSmith.