2010-09-24 33 views
8

Tôi cần cung cấp dịch vụ cho bên thứ ba sẽ gửi tin nhắn xà phòng có Dấu thời gian đã ký.Dịch vụ WCF với WS-Security yêu cầu Dấu thời gian đã ký chỉ

Tôi làm cách nào để định cấu hình dịch vụ của mình để hỗ trợ điều này?

CẬP NHẬT tôi đã quản lý để có được gần với định dạng của thông điệp Xà phòng mà chúng ta đang theo đuổi nhưng WCF khăng khăng ký cả tên người dùng và các thẻ timestamp, Có cách nào để thay đổi ràng buộc để chỉ ký dấu thời gian?


Cập nhật Hơn nữa Dưới đây là yêu cầu của chúng tôi:

  • Yếu tố Timestamp PHẢI được ký kết.
  • Tên CN trên chứng chỉ được sử dụng để ký PHẢI khớp với Tên người dùng cung cấp trong phần tử UsernameToken.
  • Chứng chỉ được sử dụng để ký PHẢI được gửi trong phần tử BinarySecurityToken.
  • Phần tử KeyInfo PHẢI chỉ chứa phần tử SecurityTokenReference, phần tử này phải được sử dụng để tham chiếu BinarySecurityToken.
  • Thuật toán chuẩn hóa phải được chỉ định.
  • SignatureMethod PHẢI được chỉ định và PHẢI là SHA-1 hoặc SHA-2 alghorithm.
  • Chữ ký tách rời NÊN được sử dụng.

Mọi đề xuất?

HIỆN CONFIG

Khách hàng Binding

<bindings> 
    <wsHttpBinding> 
    <binding name="WSBC"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" proxyCredentialType="None"></transport> 
     <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Khách hàng Endpoint

<client> 
    <endpoint address="https://localhost/WcfTestService/Service2.svc" 
    behaviorConfiguration="CCB" binding="wsHttpBinding" 
    bindingConfiguration="WSBC" 
    contract="ServiceReference2.IService2" 
    name="wsHttpBinding_IService2" /> 
</client> 

Khách hàng Behavior

<behaviors> 
    <endpointBehaviors> 
    <behavior name="MBB"> 
     <clientCredentials> 
     <clientCertificate findValue="03 58 d3 bf 4b e7 67 2e 57 05 47 dc e6 3b 52 7f f8 66 d5 2a" 
          storeLocation="LocalMachine" 
          storeName="My" 
          x509FindType="FindByThumbprint" /> 
     <serviceCertificate> 
      <defaultCertificate findValue="03 58 d3 bf 4b e7 67 2e 57 05 47 dc e6 3b 52 7f f8 66 d5 2a" 
           storeLocation="LocalMachine" 
           storeName="My" 
           x509FindType="FindByThumbprint" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Dịch vụ Binding

<bindings> 
    <wsHttpBinding> 
    <binding name="ICB"> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Certificate" proxyCredentialType="None"></transport> 
     <message clientCredentialType="UserName" 
        negotiateServiceCredential="false" 
        establishSecurityContext="false" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

Serice Endpoint

<service name="WcfTestService.Service2" behaviorConfiguration="SCB"> 
    <endpoint  address="" binding="wsHttpBinding" contract="WcfTestService.IService2" 
    bindingConfiguration="ICB" name="MS" /> 
</service> 

Behavior Dịch vụ

<behaviors> 
    <serviceBehaviors> 
    <behavior name="SCB"> 
     <serviceCredentials> 
     <serviceCertificate  findValue="4d a9 d8 f2 fb 4e 74 bd a7 36 d7 20 a8 51 e2 e6 ea 7d 30 08" 
           storeLocation="LocalMachine" 
           storeName="TrustedPeople" 
           x509FindType="FindByThumbprint" /> 
     <userNameAuthentication 
      userNamePasswordValidationMode="Custom" 
      customUserNamePasswordValidatorType="WcfTestService.UsernameValidator, WcfTestService" /> 
     <clientCertificate> 
      <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
     </clientCertificate> 
     </serviceCredentials> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
+1

Bạn đã quản lý để cấu hình hoạt động sao cho chỉ có phần tử Dấu thời gian đã được ký? Tôi hiện đang cố gắng đạt được điều tương tự. – Edward

Trả lời

3

Bạn có thể muốn xem xét một lớp liên kết an ninh tùy chỉnh mà thực hiện an ninh chỉ là cách bạn muốn nó, chứ không phải hơn WCF mặc định.

Các liên kết này MSDN giải thích Bindings Tuỳ chỉnh và SecurityBindingElement lớp cơ sở trừu tượng:

http://msdn.microsoft.com/en-us/library/ms730305.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.securitybindingelement.aspx

+0

Đó không phải là tôi! Tôi đã kéo tóc của tôi ra ràng buộc để có được một ràng buộc tùy chỉnh để tạo ra kết quả chính xác! Tôi nên cập nhật các câu hỏi, như bây giờ về cơ bản những gì tôi muốn là basicHttpBinding (Soap 1.1) với chế độ bảo mật = TransportWithMessageCredential với cả hai chứng chỉ cho tin nhắn và vận chuyển .. Nhưng ngoài ra chúng ta cần phải gửi/nhận UsernameToken aswell ..! –

+0

Cảm ơn nhận xét @Dog Ears, bạn có nghĩ rằng nó đáng để tạo một câu hỏi mới với yêu cầu cụ thể hơn của bạn? –

0

Bạn có thể làm điều này với hợp đồng nhắn, xem: http://msdn.microsoft.com/en-us/library/ms730255.aspx

Dưới đây là một ví dụ từ liên kết ở trên:

[MessageContract] 
public class PatientRecord 
{ 
    [MessageHeader(ProtectionLevel=None)] public int recordID; 
    [MessageHeader(ProtectionLevel=Sign)] public string patientName; 
    [MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN; 
    [MessageBodyMember(ProtectionLevel=None)] public string comments; 
    [MessageBodyMember(ProtectionLevel=Sign)] public string diagnosis; 
    [MessageBodyMember(ProtectionLevel=EncryptAndSign)] public string medicalHistory; 
} 

Lưu ý cấp độ bảo vệ None, Sign, EncryptAndSign

+0

Tôi không nghĩ rằng điều này sẽ làm việc Tôi về cơ bản cố gắng để thêm một wsse: UserNameToken nhưng cách sử dụng phương pháp này không hoạt động như khuôn khổ nhận ra các mã thông báo và ném một lỗi như nó không mong đợi như một phần ràng buộc? –

1

WCF không thực sự cho phép ký dấu thời gian chứ không phải tên người dùng. Trước tiên, tôi chắc chắn rằng điều này không liên quan đến vấn đề bạn đang gặp phải - một máy chủ có thể xử lý cả hai trường hợp. Nếu bạn cần nó thì tôi khuyên bạn không nên sử dụng tên người dùng trong bảo mật (ví dụ: chế độ bảo mật của "anonymousForCertificate") và sau đó triển khai bộ mã hóa thông điệp tùy chỉnh để đẩy thẻ tên người dùng/mật khẩu theo cách thủ công vào tiêu đề ở đúng vị trí cẩn thận không thay đổi bất kỳ phần nào đã ký trong tin nhắn, chủ yếu là dấu thời gian).

+0

Đó là một câu hỏi cũ mà tôi chỉ muốn giải quyết, yêu cầu ban đầu chỉ dành cho tên người dùng, không có mật khẩu, (tên người dùng là để giữ tên chung SSL cert). Chúng tôi đã được quyết định, chúng tôi phải triển khai cả máy chủ và ứng dụng khách sẽ kết nối với hệ thống của bên thứ ba mà chúng tôi không có quyền kiểm soát (Java). Tôi sẽ cung cấp cho bộ mã hóa một whirl, bất kỳ liên kết nào đến thông tin về mã hóa tùy chỉnh sẽ hữu ích. Trân trọng. –

+0

http://msdn.microsoft.com/en-us/library/ms751486.aspx –

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