não System.Net.WebClient não funciona com autenticação do Windows
Pergunta
Eu estou tentando usar System.Net.WebClient em um aplicativo WinForms para carregar um arquivo para um servidor IIS6 que tem autenticação do Windows como -lo único método 'autenticação'.
WebClient myWebClient = new WebClient();
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword");
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName);
Eu recebo um 'O servidor remoto retornou um erro: (401) não autorizado', na verdade é uma 401,2
Tanto o cliente e IIS estão na mesma 2003 máquina Dev Windows Server.
Quando tento abrir a página no Firefox e inserir as mesmas credenciais corretas como no código, a página vem acima. No entanto, quando usando o IE8, eu recebo o mesmo 401.2 erro.
Tentou Chrome e Opera e ambos trabalham.
Eu 'habilitar a autenticação integrada do Windows' activada nas opções IE Internet.
O Registro de Eventos de Segurança tem uma Auditoria de falha:
Logon Failure:
Reason: An error occurred during logon
User Name: peter
Domain: boxname
Logon Type: 3
Logon Process: ÈùÄ
Authentication Package: NTLM
Workstation Name: boxname
Status code: 0xC000006D
Substatus code: 0x0
Caller User Name: -
Caller Domain: -
Caller Logon ID: -
Caller Process ID: -
Transited Services: -
Source Network Address: 127.0.0.1
Source Port: 1476
Eu costumava Process Monitor e Fiddler para investigar, mas sem sucesso.
Por que esta obra para navegadores 3o partido, mas não com o IE ou System.Net.WebClient?
Solução
Eu vi um problema semelhante, onde a segurança integrada / NTLM só irá funcionar se você está acessando o host por nome ou localhost máquina. Na verdade, é um [mal] recurso documento no Windows que é projetado para proteger contra "ataques de reflexão".
Basicamente, você precisa criar uma chave de registro na máquina que está tentando acessar o servidor, e whitelist o domínio que você está tentando acertar. Cada nome de host / FQDN tem de ser, por si própria linha - não há wildcards e o nome deve corresponder exatamente. Desde o KB artigo:
- Clique em Iniciar, clique em Executar, digite regedit e clique em OK.
- No Editor do Registro, localize e clique na seguinte chave do registro: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0
- botão direito do mouse Msv1_0 , aponte para Novo e, em seguida, clique em múltiplas cadeias de valor.
- Digite BackConnectionHostNames , e em seguida, pressione ENTER.
- botão direito do mouse BackConnectionHostNames , e em seguida, clique em Modificar.
- Na caixa Dados do valor, digite o nome do host ou os nomes de host para os sites que estão no computador local, e clique em OK.
- Sair do Editor do Registro e reinicie o computador.
Outras dicas
Você já tentou ...
new NetworkCredential( "peter", "password", "boxname" );
Você também pode tentar ...
var credCache = new CredentialCache();
credCache.Add( new Uri ("http://localhost/upload.aspx"),
"Negotiate",
new NetworkCredential("peter", "password", "boxname"));
wc.Credentials = credCache;
Além disso, de acordo com a este pode ser que o IIS está configurado errado. Tente substituir "Negociar" com o "Basic" no exemplo acima e verificar o seu IIS de configuração para o site. Há também um monte de possíveis causas aqui .
Tente ir em opções do IE e adicionar explicitamente o site à zona Intranet. Em seguida, re-executar o programa. Você também não deve executar o programa a partir de um login de administrador. Isso pode desencadear a configuração de segurança reforçada para o Internet Explorer .
Ele poderia explicar por que você pode bater o site com o Firefox e Opera, mas não com o IE ou WebClient.
Sem saber o IIS implantação, e assumindo que você tem as regras de autorização corretos para set upload no IIS (por exemplo, o direito permitem * ACL sobre os diretórios certos que você está tentando fazer upload de conteúdo para, etc), a primeira coisa que eu tentaria é definir UseDefaultCredentials a verdade em vez de explicitamente conjunto de credenciais. (Talvez você pense que você está acessando o servidor com as credenciais que estão definindo mas isso não é o caso? Isso seria possível se isso funciona.)
Este é um cenário muito comum, então eu iria incidir sobre as regras de autorização do IIS para o diretório no qual você está tentando fazer o upload do arquivo, o real ACL nesse diretório. Por ex. é o seu site se passar ou não? se for, então você tem que ter ACL do real em que dir, caso contrário, qualquer conta pool de aplicativo está sendo executado.