Eu configurei um Samba4 AD DC e posso autenticar com sucesso com meu Administrator
usuário a partir do código .net:
var directoryIdentifier = new LdapDirectoryIdentifier("127.0.0.1", 636);
var credentials = new NetworkCredential($"CN=Administrator,CN=Users,DC=ldap,DC=test,DC=dev", "admin1234!");
using(var connection = new LdapConnection(directoryIdentifier, credentials))
{
try
{
connection.SessionOptions.ProtocolVersion = 3;
connection.SessionOptions.SecureSocketLayer = true;
connection.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
connection.AuthType = AuthType.Basic;
connection.Bind(credentials);
}
}
Então com esta conexão, crio um novo usuário:
var addRequest = new AddRequest(
"CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev",
new DirectoryAttribute("objectClass", new object[] { "user" }),
new DirectoryAttribute("cn", "testuser"),
new DirectoryAttribute("uid", "testuser"),
new DirectoryAttribute("sAMAccountName", "testuser"),
new DirectoryAttribute("unicodePwd", Encoding.Unicode.GetBytes($@"""pw1234!"""))
);
var addResponse = connection.SendRequest(addRequest);
Console.WriteLine($"[ADD] response: {addResponse.ErrorMessage}");
ou fazendo o mesmo no terminal:
ldapadd -H LDAPS://127.0.0.1:636 -D "CN=Administrator,CN=Users,DC=ldap,DC=test,DC=dev" -w admin1234!
dn: CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev
objectClass: user
cn: testuser
uid: testuser
unicodePwd:: IgBwAHcAMQAyADMANAAhACIA
sAMAccountName: testUser
de onde obtive o unicodePwd echo -n "\"pw1234\!\"" | iconv -f UTF-8 -t UTF-16LE | base64
.
No entanto, ao tentar autenticar com este usuário:
var testUser_directoryIdentifier = new LdapDirectoryIdentifier("127.0.0.1", 636);
var testUser_credentials = new NetworkCredential($"CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev", "pw1234!");
using(var connection = new LdapConnection(testUser_directoryIdentifier, testUser_credentials))
{
try
{
connection.SessionOptions.ProtocolVersion = 3;
connection.SessionOptions.SecureSocketLayer = true;
connection.SessionOptions.ReferralChasing = ReferralChasingOptions.None;
connection.AuthType = AuthType.Basic;
connection.Bind(testUser_credentials);
}
}
Eu recebo o erro:
A credencial fornecida é inválida. [Código de erro 49]
Da mesma forma, para o comando do terminal
ldapwhoami -vvv -H ldaps://127.0.0.1:636 -D "CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev" -x -w pw1234\!
eu recebo
ldap_bind: Credenciais inválidas (49) informações adicionais: 80090308: LdapErr: DSID-0C0903A9, comentário: erro AcceptSecurityContext, dados 533, v1db1
Ao executar ldbsearch -H /var/lib/samba/private/sam.ldb '(cn=testuser)' unicodePwd
no samba AD DC, recebo o seguinte:
# record 1
dn: CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev
unicodePwd:: 0pQq91kmGPJQOuQ3oiHPgg==
[...]
(Pergunta secundária, 0pQq91kmGPJQOuQ3oiHPgg==
não é igual ao que eu passei, IgBwAHcAMQAyADMANAAhACIA
não faço ideia do porquê. Porém, parece não relacionado.)
Porém, quando uso a smbpasswd
ferramenta e defino a mesma senha, parece funcionar:
smbpasswd testuser
Posso confirmar isso executando novamente ldbsearch -H /var/lib/samba/private/sam.ldb '(cn=testuser)' unicodePwd
e recebendo o mesmo registro de volta.
Desta vez, o mesmo script bash funciona:
ldapwhoami -vvv -H ldaps://127.0.0.1:636 -D "CN=testuser,CN=Users,DC=ldap,DC=test,DC=dev" -x -w pw1234\!
ldap_initialize( ldaps://127.0.0.1:636/??base )
u:DEV-AD\testUser
Result: Success (0)
Por que uma mensagem LDAP simples não funciona (que está totalmente de acordo com as unicodePwd
especificações do Active Directory)? O smbpasswd também atualiza algo que é usado na autenticação via ldapsearch -D -w
ou .net LdapConnection
?