Existe uma maneira simples e imediata de se passar por um usuário no .NET?
Até agora, tenho usado essa classe do projeto de código para todos os meus requisitos de representação.
Existe uma maneira melhor de fazer isso usando o .NET Framework?
Eu tenho um conjunto de credenciais de usuário (nome de usuário, senha, nome de domínio) que representa a identidade que eu preciso representar.
c#
.net
impersonation
ashwnacharya
fonte
fonte
Respostas:
Aqui está uma boa visão geral dos conceitos de representação do .NET.
Basicamente, você aproveitará essas classes que estão prontas para uso na estrutura .NET:
O código geralmente pode ficar longo e é por isso que você vê muitos exemplos, como o que você faz referência, que tenta simplificar o processo.
fonte
"Representação" no espaço .NET geralmente significa executar código em uma conta de usuário específica. É um conceito um pouco separado do que obter acesso a essa conta de usuário por meio de um nome de usuário e senha, embora essas duas idéias sejam frequentemente combinadas. Descreverei os dois e depois explicarei como usar minha biblioteca SimpleImpersonation , que os utiliza internamente.
Representação
As APIs para representação são fornecidas no .NET por meio do
System.Security.Principal
namespace:O código mais recente (.NET 4.6+, .NET Core etc.) geralmente deve ser usado
WindowsIdentity.RunImpersonated
, o que aceita um identificador para o token da conta do usuário e, em seguida, umAction
ouFunc<T>
para o código executar.ou
O código mais antigo usava o
WindowsIdentity.Impersonate
método para recuperar umWindowsImpersonationContext
objeto. Esse objeto é implementadoIDisposable
, portanto geralmente deve ser chamado de umusing
bloco.Embora essa API ainda exista no .NET Framework, ela geralmente deve ser evitada e não está disponível no .NET Core ou no .NET Standard.
Acessando a conta do usuário
A API para usar um nome de usuário e senha para obter acesso a uma conta de usuário no Windows é
LogonUser
- que é uma API nativa do Win32. No momento, não existe uma API .NET interna para chamá-la, portanto, é necessário recorrer à P / Invoke.Esta é a definição básica de chamada, no entanto, há muito mais a considerar para usá-la realmente na produção:
SecureString
quando você pode coletar um com segurança, pressionando as teclas do usuário.A quantidade de código a ser escrito para ilustrar tudo isso está além do que deveria estar em uma resposta do StackOverflow, IMHO.
Uma abordagem combinada e mais fácil
Em vez de escrever tudo isso você mesmo, considere usar minha biblioteca SimpleImpersonation , que combina representação e acesso de usuário em uma única API. Funciona bem em bases de código modernas e antigas, com a mesma API simples:
ou
Observe que é muito semelhante à
WindowsIdentity.RunImpersonated
API, mas não requer que você saiba nada sobre identificadores de token.Esta é a API da versão 3.0.0. Consulte o leia-me do projeto para obter mais detalhes. Observe também que uma versão anterior da biblioteca usava uma API com o
IDisposable
padrão, semelhante aWindowsIdentity.Impersonate
. A versão mais recente é muito mais segura e ambas ainda são usadas internamente.fonte
Undo
chamada durante o descarte.Provavelmente é isso que você deseja:
Mas eu realmente preciso de mais detalhes para ajudá-lo. Você pode se passar por um arquivo de configuração (se estiver tentando fazer isso em um site), ou por meio de decoradores de métodos (atributos), se for um serviço WCF, ou através de ... você entendeu.
Além disso, se estivermos falando de se passar por um cliente que chamou um serviço específico (ou aplicativo da web), você precisará configurar o cliente corretamente para que ele transmita os tokens apropriados.
Por fim, se o que você realmente deseja fazer é Delegação, você também precisará configurar o AD corretamente para que usuários e máquinas sejam confiáveis para delegação.
Editar:
dê uma olhada aqui para ver como se passar por um usuário diferente e para obter mais documentação.
fonte
Aqui está a minha porta vb.net da resposta de Matt Johnson. Eu adicionei uma enumeração para os tipos de logon.
LOGON32_LOGON_INTERACTIVE
foi o primeiro valor de enumeração que funcionou para o servidor sql. Minha cadeia de conexão era apenas confiável. Nenhum nome de usuário / senha na cadeia de conexão.Você precisa usar com uma
Using
instrução para conter algum código para executar a representação.fonte
Veja mais detalhes da minha resposta anterior Criei um pacote de nuget Nuget
Código no Github
amostra: você pode usar:
Vieuw o código completo:
fonte
Estou ciente de que estou atrasado para a festa, mas considero que a biblioteca de Phillip Allan-Harding é a melhor para este caso e similares.
Você só precisa de um pequeno pedaço de código como este:
E adicione a classe dele:
Representação do .NET (C #) com credenciais de rede
Meu exemplo pode ser usado se você precisar que o logon representado tenha credenciais de rede, mas ele tem mais opções.
fonte
Você pode usar esta solução. (Use o pacote nuget) O código fonte está disponível em: Github: https://github.com/michelcedric/UserImpersonation
Mais detalhes https://michelcedric.wordpress.com/2015/09/03/usurpation-didentite-dun-user-c-user-impersonation/
fonte