Como posso validar um nome de usuário e senha no Active Directory? Quero apenas verificar se um nome de usuário e senha estão corretos.
526
Como posso validar um nome de usuário e senha no Active Directory? Quero apenas verificar se um nome de usuário e senha estão corretos.
Se você trabalha no .NET 3.5 ou mais recente, pode usar o System.DirectoryServices.AccountManagement
espaço para nome e verificar facilmente suas credenciais:
// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
// validate the credentials
bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}
É simples, é confiável, é um código gerenciado 100% C # do seu lado - o que mais você pode pedir? :-)
Leia tudo sobre isso aqui:
Atualizar:
Conforme descrito nesta outra pergunta do SO (e suas respostas) , há um problema com essa chamada possivelmente retornando True
senhas antigas de um usuário. Esteja ciente desse comportamento e não fique surpreso se isso acontecer :-) (obrigado a MikeGledhill por apontar isso!)
UserPrinciple.FindByIdentity
para verificar se o ID do usuário passado existe primeiro.ContextOptions.Negotiate
.Fazemos isso na nossa Intranet
Você precisa usar System.DirectoryServices;
Aqui estão as entranhas do código
fonte
strPassword
está armazenado no LDAP em texto sem formatação?Close()
umausing
variável.Várias soluções apresentadas aqui não têm a capacidade de diferenciar entre um usuário / senha incorretos e uma senha que precisa ser alterada. Isso pode ser feito da seguinte maneira:
Se a senha do usuário estiver incorreta ou o usuário não existir, o erro conterá
"8009030C: LdapErr: DSID-0C0904DC, comentário: erro AcceptSecurityContext, dados 52e, v1db1",
se a senha do usuário precisar ser alterada, ela conterá
"8009030C: LdapErr: DSID-0C0904DC, comentário: erro AcceptSecurityContext, dados 773, v1db1"
O
lexc.ServerErrorMessage
valor dos dados é uma representação hexadecimal do código de erro do Win32. Esses são os mesmos códigos de erro que seriam retornados invocando a chamada da API Win32 LogonUser. A lista abaixo resume um intervalo de valores comuns com valores hexadecimais e decimais:fonte
System.DirectoryServices
eSystem.DirectoryServices.Protocols
solução muito simples usando DirectoryServices:
o acesso NativeObject é necessário para detectar um usuário / senha incorreto
fonte
PrincipleContext
- que só existe no .NET 3.5. Mas se você estiver usando o .NET 3.5 ou mais recente, você deve usarPrincipleContext
Infelizmente, não há uma maneira "simples" de verificar as credenciais de um usuário no AD.
Com todos os métodos apresentados até agora, você pode obter um falso negativo: os cleds de um usuário serão válidos, no entanto, o AD retornará false sob certas circunstâncias:
O ActiveDirectory não permitirá que você use LDAP para determinar se uma senha é inválida devido ao fato de um usuário precisar alterar a senha ou se a senha expirou.
Para determinar a alteração da senha ou a senha expirada, você pode chamar o Win32: LogonUser () e verificar o código de erro do Windows para as 2 seguintes constantes:
fonte
Provavelmente, a maneira mais fácil é PInvoke LogonUser Win32 API.eg
Referência do MSDN aqui ...
Definitivamente deseja usar o tipo de logon
Isso cria apenas um token leve - perfeito para verificações de AuthN. (outros tipos podem ser usados para criar sessões interativas etc.)
fonte
LogonUser
API exige que o usuário tenha o ato como parte da privelagem do sistema operacional ; o que não é algo que os usuários recebem - e não é algo que você deseja conceder a todos os usuários da organização. ( Msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )Uma solução .Net completa é usar as classes do espaço para nome System.DirectoryServices. Eles permitem consultar um servidor AD diretamente. Aqui está uma pequena amostra que faria isso:
Esse código se conecta diretamente ao servidor AD, usando as credenciais fornecidas. Se as credenciais forem inválidas, searcher.FindOne () lançará uma exceção. O ErrorCode é aquele que corresponde ao erro COM "nome de usuário / senha inválido".
Você não precisa executar o código como um usuário do AD. Na verdade, eu o utilizo com êxito para consultar informações em um servidor AD, de um cliente fora do domínio!
fonte
Ainda outra chamada .NET para autenticar rapidamente credenciais LDAP:
fonte
Experimente este código (Observação: relatado para não funcionar no Windows Server 2000)
exceto que você precisará criar sua própria exceção personalizada para "LogonException"
fonte
Se você está preso ao .NET 2.0 e ao código gerenciado, aqui está outra maneira de funcionar com contas locais e de domínio:
fonte
A autenticação do Windows pode falhar por vários motivos: nome de usuário ou senha incorretos, conta bloqueada, senha expirada e muito mais. Para distinguir esses erros, chame a função API LogonUser via P / Invoke e verifique o código de erro se a função retornar
false
:Uso da amostra:
Nota: O LogonUser requer uma relação de confiança com o domínio contra o qual você está validando.
fonte
Minha função simples
fonte
Aqui minha solução completa de autenticação para sua referência.
Primeiro, adicione as quatro referências a seguir
fonte