문제

Winforms 응용 프로그램에서 System.net.webclient를 사용하여 '인증'메소드만으로 Windows 인증이있는 IIS6 서버에 파일을 업로드하려고합니다.

WebClient myWebClient = new WebClient();
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword"); 
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName);

나는 '원격 서버가 오류를 반환했다 : (401) 무단으로, 실제로 401.2입니다.

클라이언트와 IIS는 모두 동일한 Windows Server 2003 Dev Machine에 있습니다.

Firefox에서 페이지를 열고 코드와 동일한 올바른 자격 증명을 입력하려고하면 페이지가 나타납니다. 그러나 IE8을 사용할 때 동일한 401.2 오류가 발생합니다.

크롬과 오페라를 시도했고 둘 다 작동합니다.

IE 인터넷 옵션에서 '통합 된 Windows 인증'을 활성화했습니다.

보안 이벤트 로그에는 실패 감사가 있습니다.

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

나는 프로세스 모니터와 피들러를 사용하여 조사했지만 아무 소용이 없었습니다.

왜 이것이 제 3 자 브라우저에서 효과가 있지만 IE 또는 System.net.webclient에서는 작동하지 않습니까?

도움이 되었습니까?

해결책

통합 / NTLM 보안이 기계 이름 또는 로컬 호스트별로 호스트에 액세스하는 경우에만 작동하는 비슷한 문제를 보았습니다. 실제로, "반사 공격"으로부터 보호하도록 설계된 Windows의 [제대로] 문서 기능입니다.

기본적으로 서버에 액세스하려는 머신에서 레지스트리 키를 만들고 누르려는 도메인을 화이트리스트로 만들어야합니다. 각 호스트 이름 / fqdn은 자체 라인에 있어야합니다. 와일드 카드가 없으며 이름이 정확히 일치해야합니다. KB 기사에서 :

  • 시작을 클릭하고 실행을 클릭하고 Regedit을 입력 한 다음 확인을 클릭합니다.
  • 레지스트리 편집기에서 다음 레지스트리 키를 찾은 다음 클릭하십시오.hkey_local_machine system currentControlset Control lsa msv1_0
  • 마우스 오른쪽 버튼으로 클릭 MSV1_0, 새로운 것을 가리키 다음, 멀티 스트링 값을 클릭하십시오.
  • 유형 BackConnectionHostNames, 그런 다음 Enter를 누릅니다.
  • 마우스 오른쪽 버튼으로 클릭 BackConnectionHostNames, 그런 다음 수정을 클릭합니다.
  • 값 데이터 상자에 로컬 컴퓨터에있는 사이트의 호스트 이름 또는 호스트 이름을 입력 한 다음 확인을 클릭하십시오.
  • 레지스트리 편집기를 종료 한 다음 컴퓨터를 다시 시작하십시오.

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

다른 팁

시도해 보셨습니까 ...

new NetworkCredential( "peter", "password", "boxname" );

당신은 또한 시도 할 수도 있습니다 ...

var credCache = new CredentialCache();
credCache.Add( new Uri ("http://localhost/upload.aspx"),
                 "Negotiate",
                 new NetworkCredential("peter", "password", "boxname"));
wc.Credentials = credCache;

또한,에 따르면 이것 IIS가 잘못 구성된 것일 수 있습니다. 위의 "기본"으로 "협상"을 대체하고 웹 사이트의 IIS 구성을 확인하십시오. 가능한 원인도 있습니다 여기.

IE의 옵션으로 이동하여 사이트를 인트라넷 영역에 명시 적으로 추가하십시오. 그런 다음 프로그램을 다시 실행하십시오. 관리자 로그인에서 프로그램을 실행하지 않아야합니다. 이것은 트리거 될 수 있습니다 Internet Explorer를위한 강화 된 보안 구성.

Firefox 및 Opera로 사이트를 칠 수있는 이유를 설명 할 수 있지만 IE 또는 WebClient는 그렇지 않습니다.

IIS 배포를 알지 못하고 IIS에서 업로드에 대한 올바른 권한 부여 규칙이 있다고 가정하지 않고 (예 : 올바른* ACL이 오른쪽에 컨텐츠를 업로드하려는 오른쪽에* ACL이 허용됩니다) 명시 적으로 설정하는 대신 usedefaultcredentials true에 대한 자격 증명을 설정합니다. (아마도 당신은 당신이 설정중인 자격 증명으로 서버에 액세스하고 있다고 생각하지만 그렇지 않습니까? 이것이 작동하면 가능할 것입니다.)

이것은 매우 일반적인 시나리오이므로 파일을 업로드하려는 디렉토리의 IIS 권한 부여 규칙에 중점을두고 있습니다. 해당 디렉토리의 실제 ACL입니다. 전. 귀하의 사이트가 가장 하는가? 그렇다면, 실제 ACL이 해당 Dir에 있어야합니다. 그렇지 않으면 모든 계정 앱 풀이 실행됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top