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?

Foi útil?

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.

http://support.microsoft.com/kb/956158/en-us

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top