2011-08-31 33 views
5

Ứng dụng C# của tôi truy cập máy chủ web sử dụng xác thực NTLM.Cách 'chia sẻ' xác thực NTLM qua nhiều HttpWebRequests?

Tôi thấy rằng mỗi yêu cầu được gửi tới máy chủ (sử dụng HttpWebRequest mới) được xác thực riêng lẻ. Nói cách khác, mọi yêu cầu dẫn đến phản hồi 401, sau đó một cuộc hội thoại bắt tay NTLM xảy ra trước khi tôi nhận được phản hồi thực tế.

ví dụ:

Đầu tiên yêu cầu GET:

-> GET xyz 
<- 401 error (WWW-Authenticate:NTLM) 

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM base64stuff) 

-> GET xyz (Authorization: base64stuff) 
<- 200 

Tiếp theo yêu cầu:

-> GET xyz (Authorization:NTLM base64stuff) 
<- 401 error (WWW-Authenticate:NTLM) //can this request be avoided? 

-> GET xyz (Authorization: base64stuff) 
<- 200 

(ban đầu, với PreAuthenticate đặt sai, các yêu cầu tiếp theo trông giống như yêu cầu đầu tiên - tức là ba yêu cầu cơ bản cho mỗi 'yêu cầu')

Có một cách 'chia sẻ' xác thực được thực hiện trên yêu cầu đầu tiên tới máy chủ với HttpWebRequests tiếp theo?

Tôi nghĩ có lẽ thuộc tính UnsafeAuthenticatedConnectionSharing sẽ cho phép tôi thực hiện việc này, nhưng đặt nó thành true cho tất cả các đối tượng HttpWebRequest được sử dụng trong ứng dụng không có hiệu lực.

Tuy nhiên nếu tôi đặt PreAuthenticate thành true, một phản hồi 401 ít xảy ra cho mỗi yêu cầu sau lần đầu tiên.

+0

Bạn đang cố gắng giải quyết vấn đề gì? –

+0

Tôi muốn thực hiện 'xác thực' một cách hiệu quả một lần và sử dụng lại điều này trên HttpWebRequests. Thay vì xác thực mỗi khi tôi nhấn máy chủ. Tôi có thể hiểu lầm NTLM mặc dù, và trong thực tế, NTLM áp đặt một chi phí của một yêu cầu thêm trên mỗi yêu cầu thực hiện. – mackenir

+0

Có nhưng vấn đề với cách nó hoạt động là gì, vấn đề gì sẽ giải quyết để thay đổi hành vi mà bạn mô tả về hành vi mà bạn mong muốn, bạn đang cố gắng đạt được điều gì trong thế giới thực. –

Trả lời

3

Yêu cầu cuối cùng được gửi sau khi NTLM được thực hiện (yêu cầu được gửi đến 200 phản hồi) chứa tiêu đề xác thực cho máy chủ biết rằng bạn có thông tin đăng nhập chính xác.

Tôi không chắc chắn nếu lớp khách hàng có tính năng để giữ điều này bằng cách riêng của mình, nhưng nếu bạn tìm thấy một số cách để giữ lại tiêu đề này và thêm nó vào yêu cầu tiếp theo của bạn nó sẽ hoạt động tốt.


Cập nhật: NTLM xác thực kết nối, vì vậy bạn cần giữ kết nối của mình luôn mở bằng tiêu đề Keep-Alive. Lớp khách hàng nên cung cấp một số cài đặt cho việc này. Để biết thêm thông tin, hãy xem trang này, mà tôi thấy rất hữu ích và rõ ràng về sơ đồ NTLM:

http://www.innovation.ch/personal/ronald/ntlm.html

+0

Hmmm. Có thể thiết lập tiêu đề Authorization trên một HttpWebRequest, và tôi đã thử điều đó. Tuy nhiên nó không hoạt động - máy chủ trả về một yêu cầu 400 Bad, chỉ ra rằng tiêu đề Authorization không thể được 'replayed' theo cách này. Mà tôi cho là có ý nghĩa vì lý do an ninh. – mackenir

+0

Xem chỉnh sửa của tôi ở trên – Iravanchi

+0

Sau khi thực hiện một chút thử nghiệm, có vẻ như, mặc dù HttpWebRequest có thuộc tính KeepAlive, rằng nó không cải thiện mọi thứ trên và ở trên thiết lập PreAuthenticate = true. Một chút khó chịu. – mackenir

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