Pergunta

Eu tenho um site ASP.NET em um Windows 2003 Server, que precisa acessar arquivos de um compartilhamento de rede. O compartilhamento de rede é protegido por senha e precisa de um nome de usuário e senha a serem fornecidos.

I usar autenticação de formulários com base nas janelas do Web site e não com base.

Então, meu problema é que quando eu tento ler qualquer arquivo do networkshare usando o código abaixo, ele lança o acesso negado DirectoryInfo networkshare = new DirectoryInfo ( "\\ TestServer \ Share");

Então, eu tentei usar representar, fornecendo o nome de usuário ea senha do compartilhamento de rede para a chamada de função impersonate, no entanto a chamada, obviamente, não desde que nome de usuário não existe no ASP.NET servidor web. Assim então eu passei o nome de usuário ea senha de um login que existe no servidor web, por isso desta vez a chamada impersonate funciona no entanto, ainda não é possível acessar o compartilhamento de rede 'cuz o nome de usuário compartilhamento de rede e senha são diferentes.

Então, finalmente, eu criei o mesmo nome de usuário / senha exata no servidor web que combina o compartilhamento de rede. Esta chamada de função impersonate tempo funciona e assim que faz compartilhamento de rede. Eu sou capaz de ler com sucesso a partir do compartilhamento.

Então, minha pergunta é, existe uma maneira que eu possa ler o compartilhamento de rede sem adicionar o nome de usuário no servidor web. Porque sempre que a alterações de login compartilhamento de rede, eu vou ter que fazer novamente um novo nome de usuário no servidor web também. O que não é ideal.

Todas as idéias?

Foi útil?

Solução

A maneira "certa" de fazer isso é para executar AppPool do servidor web como a identidade que podem acessar o compartilhamento. Dessa forma, o armazenamento única credencial é feito com segurança na configuração do IIS (em vez de no seu código ou em arquivos de configuração legíveis). Colocar o servidor web e servidor de arquivos no mesmo domínio do Windows (ou diferentes domínios com confiança) é a maneira mais fácil, mas a coisa "mesmo nome de usuário / senha" deve trabalhar lá também.

Se você não se importa em colocar nomes de usuário / senhas em seu código ou configuração, você pode P / Invoke para WNetAddConnection2 e passar o nome de usuário / por palavra-passe, então você deve ser capaz de acessar o compartilhamento. Isto não requer o servidor para ter uma conta correspondente, mas você realmente deve proteger a senha (olhar para System.Security.Cryptography.ProtectedData para o armazenamento de registro criptografado).

Outras dicas

Tente este

WebRequest request = WebRequest.Create( "http://server/file.xml" );
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "user", "pass" );

request.GetResponse();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top