2009-06-23 30 views
12

Tôi đang cố gắng sử dụng System.Net.WebClient trong ứng dụng WinForms để tải tệp lên máy chủ IIS6 có xác thực Windows là chỉ phương thức 'Xác thực'.System.Net.WebClient không hoạt động với Xác thực Windows

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

tôi nhận được một 'Các máy chủ từ xa trở về một lỗi: (401) trái phép', trên thực tế nó là một 401,2

Cả khách hàng và IIS là trên cùng một máy Dev Windows Server 2003.

Khi tôi cố gắng mở trang trong Firefox và nhập cùng thông tin xác thực giống như trong mã, trang sẽ xuất hiện. Tuy nhiên khi sử dụng IE8, tôi gặp lỗi 401.2.

Đã thử Chrome và Opera và cả hai đều hoạt động.

Tôi bật tính năng 'Bật xác thực Windows tích hợp' trong tùy chọn Internet của IE.

Security Event Log có Audit thất bại:

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 

tôi đã sử dụng Process Monitor và Fiddler để điều tra nhưng không có kết quả.

Tại sao tính năng này hoạt động cho trình duyệt của bên thứ ba nhưng không hoạt động với IE hoặc System.Net.WebClient?

+0

Sau khi thay đổi các phương thức xác thực duy nhất trong IIS từ Integrated Windows để cơ bản nó hoạt động, nhưng điều đó không giải quyết vấn đề của tôi bởi vì tôi không thể thay đổi điều đó thiết lập trên máy chủ sản xuất. –

+0

Tôi đã sử dụng công cụ Chẩn đoán và Xác thực Kiểm soát Truy cập của IIS 'để theo dõi quá trình và so sánh nhật ký cho Firefox với trình duyệt dành cho IE. Dường như tất cả đều ổn cho đến khi thử thách/phản hồi NTLM thất bại, nhưng nó cũng không cho tôi bất kỳ đầu mối nào tại sao nó thực hiện. –

+0

Tôi đã thực hiện một số thử nghiệm khác: Máy chủ 2003 mô tả ở trên thực sự là một máy ảo trong Virtual PC, khi sử dụng IE từ máy chủ tôi có thể xác thực, nhưng không sử dụng IE trên máy khách. Tuy nhiên, bằng cách sử dụng trình duyệt IE của khách hàng khi sử dụng địa chỉ IP của trang web thay vì tên máy chủ được thiết lập thông qua tệp máy chủ lưu trữ. Đôi khi bị hỏng ở đây! Tôi chỉ vui vì nó không phải trên một máy chủ sản xuất. –

Trả lời

18

Tôi đã thấy một vấn đề tương tự, trong đó bảo mật Tích hợp/NTLM sẽ chỉ hoạt động nếu bạn đang truy cập máy chủ theo tên máy hoặc máy chủ cục bộ. Trong thực tế, nó là một tính năng tài liệu [kém] trong Windows được thiết kế để bảo vệ chống lại "các cuộc tấn công phản chiếu".

Về cơ bản, bạn cần phải tạo khóa đăng ký trên máy đang cố truy cập máy chủ và đưa danh sách trắng vào miền bạn đang cố gắng truy cập. Mỗi tên máy chủ/FQDN cần phải nằm trên dòng riêng của nó - không có ký tự đại diện và tên phải khớp chính xác. Từ bài viết KB:

  • Bấm Bắt đầu, bấm Chạy, gõ regedit, rồi bấm OK.
  • Trong Registry Editor, xác định vị trí và sau đó nhấp vào khóa registry sau đây: HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0
  • Kích chuột phải vào MSV1_0, điểm đến Mới, và sau đó nhấp vào Multi-String Giá trị.
  • Nhập BackConnectionHostNames, sau đó nhấn ENTER.
  • Nhấp chuột phải BackConnectionHostNames, sau đó bấm Sửa đổi.
  • Trong hộp Dữ liệu giá trị, hãy nhập tên máy chủ hoặc tên máy chủ lưu trữ cho các trang web trên máy tính cục bộ, sau đó bấm OK.
  • Thoát khỏi Registry Editor, rồi khởi động lại máy tính.

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

+3

+10 Nếu tôi có thể upvote này 10 lần tôi sẽ. Đã kết thúc 3 ngày gãi đầu và Googling của tôi. – DancesWithBamboo

+0

+20 Tôi sẽ upvote này 20 lần nếu tôi có thể. –

4

Bạn đã cố gắng ...

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

Bạn cũng có thể thử ...

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

Ngoài ra, theo this nó có thể là IIS được cấu hình sai. Hãy thử thay thế "Thương lượng" bằng "Cơ bản" ở trên và kiểm tra cấu hình IIS của bạn cho trang web. Ngoài ra còn có một số nguyên nhân có thể là here.

+0

Chỉ cần thử, cùng một phản hồi 401.2 và 'Kiểm tra lỗi' –

+0

Cũng đã thử phiên bản 'Thương lượng', cùng một kết quả. Những gì buffles tôi là cũng không hoạt động trong IE. –

0

Nếu không biết triển khai IIS của bạn và giả sử rằng bạn có quy tắc ủy quyền chính xác cho tải lên được đặt trong IIS (ví dụ: quyền cho phép * ACL trên đúng thư mục bạn đang cố tải nội dung lên, v.v.) thử là đặt UseDefaultCredentials thành true thay vì đặt Credential. (Có thể bạn nghĩ rằng bạn đang truy cập vào máy chủ với Thông tin đăng nhập bạn đang thiết lập nhưng đó không phải là trường hợp? Điều đó có thể xảy ra nếu điều này hoạt động.)

Đây là một kịch bản rất phổ biến, vì vậy tôi sẽ tập trung vào các quy tắc ủy quyền IIS thư mục mà bạn đang cố tải tệp lên, ACL thực trên thư mục đó. Ví dụ: trang web của bạn có mạo danh hay không? nếu có, thì bạn phải có ACL thực trên thư mục đó, nếu không thì bất kỳ hồ bơi ứng dụng tài khoản nào đang chạy.

+0

Tôi không nghĩ rằng đó là một vấn đề ACL bởi vì nó không nhận được rằng đến nay, Process Monitor không hiển thị bất kỳ hoạt động trên thư mục đích. –

+0

Chỉ cần dùng thử với UseDefaultCredentials, cũng không thành công. Tôi cần làm cho nó hoạt động với các thông tin không mặc định vì người dùng Windows khác nhau trên các máy khách và máy chủ trong sản xuất. –

1

Hãy thử đi sâu vào các tùy chọn của IE và thêm trang web vào Khu Intranet một cách rõ ràng. Sau đó chạy lại chương trình. Bạn cũng không nên chạy chương trình từ đăng nhập quản trị viên. Điều này có thể kích hoạt Enhanced Security Configuration for Internet Explorer.

Nó có thể giải thích lý do tại sao bạn có thể truy cập trang web bằng Firefox và Opera, nhưng không phải với IE hoặc WebClient.

+0

Ý tưởng hay, tôi đã thử cả hai nhưng nó vẫn không hoạt động. –

Các vấn đề liên quan