2012-02-16 11 views
5

Xin chào Tôi đã thực hiện một dịch vụ WCF được lưu trữ trong dự án Windows Azure dưới dạng WebRole.Vấn đề ràng buộc an ninh WCF

Dịch vụ của tôi được bảo mật bằng chứng chỉ SSL và thao tác này hoạt động.
Bây giờ tôi muốn thêm một số bảo mật thêm vào hợp đồng hoạt động của tôi và nếu tôi làm điều này (thiết lập một mức độ bảo vệ) tôi nhận được lỗi tiếp theo.

Tôi cần phải định cấu hình một số ràng buộc hoặc thứ gì đó khác để có được tác phẩm này nhưng tôi không biết điều gì và tôi không biết ở đâu.

thông tin

dự án:

Lỗi:

The request message must be protected. This is required by an operation of the contract ('IService1','http://tempuri.org/'). 
    The protection must be provided by the binding ('BasicHttpBinding','http://tempuri.org/'). 

Kiến trúc

enter image description here
ServiceConfiguration.Cloud.cscfg & ServiceConfiguration.Local.cscfg

<?xml version="1.0" encoding="utf-8"?> 
<ServiceConfiguration serviceName="Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*"> 
    <Role name="WCFServiceWebRole"> 
    <Instances count="1" /> 
    <ConfigurationSettings> 
     <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" /> 
    </ConfigurationSettings> 
    <Certificates> 
     <Certificate name="Certificate1" thumbprint="51F357715F" thumbprintAlgorithm="sha1" /> 
    </Certificates> 
    </Role> 
</ServiceConfiguration> 

ServiceDefinition.csdef

<?xml version="1.0" encoding="utf-8"?> 
<ServiceDefinition name="Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> 
    <WebRole name="WCFServiceWebRole" vmsize="ExtraSmall" enableNativeCodeExecution="true"> 
    <Sites> 
     <Site name="Web"> 
     <Bindings> 
      <Binding name="Endpoint1" endpointName="Endpoint1" /> 
      <Binding name="Endpoint2" endpointName="Endpoint2" /> 
     </Bindings> 
     </Site> 
    </Sites> 
    <Endpoints> 
     <InputEndpoint name="Endpoint1" protocol="http" port="80" /> 
     <InputEndpoint name="Endpoint2" protocol="https" port="8080" certificate="Certificate1" /> 
    </Endpoints> 
    <Imports> 
     <Import moduleName="Diagnostics" /> 
    </Imports> 
    <LocalResources> 
     <LocalStorage name="WCFServiceWebRole.svclog" sizeInMB="1000" cleanOnRoleRecycle="false" /> 
    </LocalResources> 
    <Certificates> 
     <Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" /> 
    </Certificates> 
    </WebRole> 
</ServiceDefinition> 

Hợp đồng

[DataContract] 
public class KlantenContract 
{ 
    [DataMember] 
    public int PARTYID { get; set; } 

    [DataMember] 
    public string firstName { get; set; } 

    [DataMember] 
    public string lastName { get; set; } 

IService1.cs

namespace WCFServiceWebRole 
{ 
    [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] 
    public interface IService1 
    { 
     [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)] 
     List<KlantenContract> GetAllKlanten(string firstName); 
    } 
} 

Web.config

<system.serviceModel> 

    <bindings> 
     <wsHttpBinding> 
     <binding name="IService1"> 
      <security mode="Transport"></security> 
     </binding> 
     <binding name="Certificate1"> 
      <security> 
      <message clientCredentialType="Certificate"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

    <services> 
     <service name="Service1" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="https://127.0.0.1:8080/Service1.svc" binding="wsHttpBinding" 
      name="Endpoint2" contract="IService1"> 
     </endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 

      <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
      <serviceCredentials> 
       <serviceCertificate findValue="CN=tempCert" /> 
      </serviceCredentials> 
      </behavior> 

      <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true" /> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

Trả lời

3

Nếu bạn đặt dịch vụ của bạn như EncryptAndSign, nó phải sử dụng vận chuyển được bảo đảm, ví dụ HTTPS. Tôi không biết trong ảnh chụp màn hình cuối cùng của bạn nếu bạn đã xem dịch vụ thông qua HTTP hoặc HTTPS, nhưng bạn phải sử dụng HTTPS.

Nếu bạn muốn IIS quan tâm đến ràng buộc bảo mật, bạn có thể đặt chế độ bảo mật thành TransportWithCredentialOnly và định cấu hình vai trò web của bạn để sử dụng chứng chỉ để liên kết với 443, mà tôi nghĩ bạn đã làm rồi nó sẽ ổn thôi.

Hoặc bạn có thể sử dụng bảo mật Giao thông vận tải và trong phần ServerCredential, bạn cần xác định chứng chỉ nào bạn muốn WCF sử dụng để tạo phương tiện bảo mật.

Tôi chưa bao giờ thử chế độ bảo mật thư nhưng tôi nghĩ rằng nó sẽ hoạt động, nhưng bạn cũng có thể cần chỉ định chứng chỉ, trong phần tử cấu hình bảo mật thư.

+0

Không, tôi vẫn gặp lỗi tương tự, nhưng tôi đoán tôi sai về cấu trúc hoặc cấu hình của mình ?? Bạn có thấy cấu trúc của tôi -> ảnh chụp màn hình cuối cùng không. sao tôi phải cấu hình ràng buộc trong web.config hoặc trong cấu hình dự án Azure? – dg90

+0

Trong web.config của bạn. Tôi sẽ có một cái nhìn khi tôi có thời gian và sau đó lấy lại cho bạn. –

+0

Cảm ơn bạn sẽ rất tuyệt, tôi đã gắn rất nhiều thứ nhưng nó luôn luôn ném lỗi tương tự như anh ấy không lấy cấu hình của tôi hoặc tôi đang định cấu hình sai.; – dg90