Dưới đây là tình hình tôi đang cố gắng để đối phó với:Làm thế nào để chuyển hướng một dịch vụ WCF đến một HTTPS endpoint với Windows chứng
Chúng tôi có một khách hàng WCF làm việc với một thiết bị đầu cuối http và https endpoint nhưng không phải khi nó được chuyển hướng (302) từ http đến https. Chúng tôi có một cân bằng tải F5 đang thực hiện chuyển hướng và chức năng SSL nhưng theo như tôi có thể nói, nó không làm bất cứ điều gì bất ngờ cho các yêu cầu. Chuyển hướng có vẻ là thủ phạm, nơi WCF không muốn cung cấp thông tin xác thực Windows Kerberos sau khi chuyển hướng được thực hiện.
Trình tự cho một cuộc gọi thành công (ví dụ http không có chuyển hướng) đi như thế này:
- Khách hàng - Gửi yêu cầu POST cho dịch vụ với chương trình http
- Server - Đáp ứng với 401 trái phép
- Khách hàng - Gửi POST thương lượng với ủy quyền
- Máy chủ - Trả lời với 100 Tiếp tục
- Khách hàng - Gửi dữ liệu xà phòng và hoàn tất thành công
Khi cuộc gọi được chuyển hướng và thất bại nó đi như thế này:
- Khách hàng - Gửi yêu cầu POST cho dịch vụ với chương trình http
- Server - Trả 302 với chuyển hướng đến https chương trình cho cùng một địa chỉ
- Khách hàng - Gửi GET cho địa chỉ https (Tôi không thể hiểu tại sao đây là GET và không phải là POST)
- Server - Trả lời 401 không được phép
- Khách hàng - ném ngoại lệ "Yêu cầu HTTP không được ủy quyền với giao thức xác thực ứng dụng khách 'Thoả thuận'. Authentication header nhận từ máy chủ là 'Negotiate, NTLM'."
Nó tương tự như this problem nhưng không giống hệt nhau (và không có một câu trả lời thực sự có mặc dù nó tham khảo 'giao thức phá vỡ WCF' mà chúng tôi có thể tìm thấy documetation trên) .Nếu chúng ta tắt quy tắc chuyển hướng F5 http và https hoạt động lưu lượng truy cập tốt.Làm WCF thực sự không xử lý chuyển hướng đơn giản này? Có một workaround hoặc bất kỳ tài liệu nào về lỗ hổng này?
Cấu hình ứng dụng khách (lưu ý rằng khi thử nghiệm điều này với https, tôi thay đổi TransportCredentialOnly thành Giao thông vận tải):
<client>
<endpoint address="http://fooserver/MyService.svc/" binding="basicHttpBinding" bindingConfiguration="clientBinding" contract="Contracts.IMyService" />
</client>
<bindings>
<basicHttpBinding>
<binding name="clientBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
máy chủ cấu hình trông như thế này:
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="securedBinding" contract="Contracts.IMyService">
</endpoint>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="securedBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<useRequestHeadersForMetadataAddress>
<defaultPorts>
<add scheme="http" port="80" />
<add scheme="https" port="443" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Có thể trùng lặp [Tại sao WCF không gọi được dịch vụ SOAP khi gặp phải phản hồi 302?] (Http://stackoverflow.com/questions/17152385/why-would-wcf-fail-to-call-a -soap-service-khi-a-302-response-là-gặp phải) – Luizgrs