Tôi có một yêu cầu để bảo mật điểm cuối dịch vụ WCF net.tcp được truyền phát bằng WIF . Nó sẽ xác thực các cuộc gọi đến đối với máy chủ mã thông báo của chúng tôi. Dịch vụ này được truyền phát vì nó được thiết kế để truyền một lượng lớn dữ liệu thứ n.
Điều này dường như là không thể. Và nếu tôi không thể đi lại được, Giáng sinh của tôi sẽ bị hủy hoại và tôi sẽ tự uống đến chết trong máng xối trong khi những người mua sắm vui vẻ bước qua cơ thể đang lạnh dần của tôi. Totes nghiêm trọng, các bạn.
Tại sao điều này là không thể? Đây là Catch-22.
Trên máy khách, tôi cần tạo một kênh với GenericXmlSecurityToken tôi nhận được từ máy chủ mã thông báo của chúng tôi. Không có vấn đề.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Tôi đã nói "không có vấn đề"? Vấn đề. Trong thực tế, NullReferenceException
phong cách vấn đề.
"Bro", tôi hỏi Framework, "bạn có kiểm tra null không?" Khung im lặng, vì vậy tôi đã tháo rời và thấy rằng
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
là nguồn gốc của ngoại lệ và GetProperty
cuộc gọi đã trở lại null
. Vậy, WTF? Hóa ra nếu tôi bật Bảo mật tin nhắn và đặt loại thông tin xác thực của khách hàng IssuedToken
thì thuộc tính này hiện tồn tại trong ClientFactory
(protip: Không có "SetProperty" tương đương trong IChannel, tên khốn).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Ngọt. Không còn NRE. Tuy nhiên, bây giờ khách hàng của tôi bị lỗi khi sinh (vẫn yêu anh, tho). Đi sâu vào chẩn đoán WCF (protip: làm cho kẻ thù tồi tệ nhất của bạn làm điều này sau khi nghiền nát chúng và lái chúng trước bạn nhưng ngay trước khi thưởng thức những lời than vãn của phụ nữ và trẻ em của chúng), tôi thấy đó là do sự không phù hợp về bảo mật giữa máy chủ và máy khách.
Nâng cấp được yêu cầu không được hỗ trợ bởi 'net.tcp: // localhost: 49627 / MyService'. Điều này có thể là do các ràng buộc không khớp (ví dụ: bảo mật được kích hoạt trên máy khách chứ không phải trên máy chủ).
Kiểm tra các dấu vết của máy chủ (một lần nữa: đè bẹp, lái xe, đọc nhật ký, thưởng thức những lời than thở), tôi thấy điều này là đúng
Ứng dụng / ssl-tls Loại giao thức được gửi đến một dịch vụ không hỗ trợ loại nâng cấp đó.
"Chà, tự," tôi nói, "Tôi sẽ chỉ bật Bảo mật tin nhắn trên máy chủ!" Và tôi làm. Nếu bạn muốn biết nó trông như thế nào, thì đó là bản sao chính xác của cấu hình máy khách. Tra cứu.
Kết quả: Kaboom.
Liên kết ('NetTcpBinding', ' http://tempuri.org/ ') hỗ trợ truyền phát mà không thể được cấu hình cùng với bảo mật cấp thông báo. Xem xét chọn một chế độ chuyển khác nhau hoặc chọn bảo mật cấp vận chuyển.
Vì vậy, máy chủ của tôi không thể được truyền phát và bảo mật thông qua mã thông báo . Bắt-22.
tl; dr: Làm cách nào tôi có thể bảo mật điểm cuối WCF được truyền phát trực tuyến bằng WIF ???
TransportWithMessageCredential
chế độ có thể là một lựa chọn khác.
<security mode="Transport" /> <transport clientCredentialType="IssuedToken" /> </security>