2012-03-07 42 views
13

Tôi đang cố tạo dịch vụ WCF sử dụng số MembershipProvider để xác thực. Bởi vì nó là một dịch vụ nội bộ Tôi hiện không quan tâm đến việc áp dụng bảo mật mức vận tải (HTTPS) và tôi muốn (hiện tại) thực hiện việc này mà không cần giấy chứng nhận. Bên cạnh đó, điều này sẽ phức tạp tung ra các dịch vụ và tôi muốn làm điều này tại một thời điểm sau đó trong thời gian. Tôi đã xây dựng một cấu hình cơ bản (thậm chí không có cấu hình MembershipProvider, nhưng WCF giữ ném cho tôi những ngoại lệ sau đây:.WCF: Chứng chỉ dịch vụ không được cung cấp. Chỉ định chứng chỉ dịch vụ trong ServiceCredentials

Giấy chứng nhận dịch vụ không được cung cấp Chỉ định một giấy chứng nhận dịch vụ trong ServiceCredentials

. Dưới đây là cấu hình của tôi:

<system.serviceModel> 
    <bindings> 
    <ws2007HttpBinding> 
     <binding name="Service1WS2007HttpBindingConfig"> 
     <security mode="Message"> 
      <transport clientCredentialType="None" /> 
      <message clientCredentialType="UserName" /> 
     </security> 
     </binding> 
    </ws2007HttpBinding> 
    </bindings> 
    <services> 
    <service name="WcfService1.Service1"> 
     <endpoint address="http://localhost:9800/Service1.svc" 
     binding="ws2007HttpBinding" 
     bindingConfiguration="Service1WS2007HttpBindingConfig" 
     contract="WcfService1.IService1" /> 
    </service> 
    </services> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false"> 
    <serviceActivations> 
     <add relativeAddress="Service1.svc" service="WcfService1.Service1" /> 
    </serviceActivations> 
    </serviceHostingEnvironment> 
</system.serviceModel> 

stackTrace của ngoại lệ:

[InvalidOperationException: Chứng chỉ dịch vụ không được cung cấp. Chỉ định chứng chỉ dịch vụ trong ServiceCredentials. ]
System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateServerX509TokenProvider() 12.382.737 System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateLocalSecurityTokenProvider (RecipientServiceModelSecurityTokenRequirement recipientRequirement) +63
System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenProvider (SecurityTokenRequirement yêu cầu) + 48
System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateTlsnegoServerX509TokenProvider (RecipientServiceModelSecurityTokenRequirement recipientRequirement) +191
System.ServiceModel.Securit y.ServiceCredentialsSecurityTokenManager.CreateTlsnegoSecurityTokenAuthenticator (RecipientServiceModelSecurityTokenRequirement recipientRequirement, Boolean requireClientCertificate, SecurityTokenResolver & sctResolver) 683
System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenAuthenticator (SecurityTokenRequirement tokenRequirement, SecurityTokenResolver & outOfBandTokenResolver) 12.383.208 System.ServiceModel.Security.SessionRenewSecurityTokenManager .CreateSecurityTokenAuthenticator (SecurityTokenRequirement tokenRequirement, SecurityTokenResolver & outOfBandTokenResolver) +81
System.S erviceModel.Security.SymmetricSecurityProtocolFactory.OnOpen (TimeSpan timeout) 181
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (TimeSpan timeout) 21
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) 318
System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open (TimeSpan timeout) +94
System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen (TimeSpan timeout) 240
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan thời gian ut) +318
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan timeout) 72

[InvalidOperationException: Các ChannelDispatcher tại 'http: // localhost: 9800/Service1.svc' với hợp đồng (s) 'IssueAndRenewSession "' là không thể mở IChannelListener của nó. ]
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan timeout) 118
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) 318 System.ServiceModel.ServiceHostBase.OnOpen (TimeSpan timeout) + 111
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) 318
System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.OnOpen (TimeSpan timeout) 131
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (TimeSpan timeout) 21
System.ServiceModel.Channels.CommunicationObject .Open (TimeSpan timeout) 318
System.ServiceModel.Security.CommunicationObjectSecurityTokenAuthenticator.Open (TimeSpan timeout) +20
System.ServiceModel.Security.SecuritySessionServerSettings.OnOpen (TimeSpan timeout) 792
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (TimeSpan timeout) 21
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) 318
System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open ( timeout TimeSpan) 148
System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen (TimeSpan timeout) 240
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) 318
System.ServiceModel.Dispatcher.ChannelDispatcher .OnOpen (TimeSpan timeout) 72

[InvalidOperationException: Các ChannelDispatcher tại 'http: // localhost: 9800/Service1.svc' với hợp đồng (s) 'IService1 "' là không thể mở IChannelListener của nó.]
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan timeout) 118
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) 318 System.ServiceModel.ServiceHostBase.OnOpen (TimeSpan timeout) 111
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeout) +318
System.ServiceModel.HostingManager.ActivateService (String normalizedVirtualPath) 206
System.ServiceModel.HostingManager.EnsureServiceAvailable (String normalizedVirtualPath) 651

[ServiceActivationException: Dịch vụ '/Service1.svc' không thể được kích hoạt do một ngoại lệ trong quá trình biên dịch. Các thông báo ngoại lệ là: ChannelDispatcher tại 'http: // localhost: 9800/Service1.svc' với hợp đồng (s) '"IService1"' là không thể mở IChannelListener của nó ..]
System.Runtime.AsyncResult .End (IAsyncResult kết quả) 688.590
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End (IAsyncResult kết quả) 190
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous (HttpApplication bối cảnh, String routeServiceVirtualPath, Boolean flowContext, Boolean ensureWFService) +234
System.ServiceModel.Activation.HttpModule.ProcessRequest (Object sender, EventArgs e) 359
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 148 System.Web. HttpApplication.ExecuteStep (bước IExecutionStep, Boolean & comp letedSynchronously) +75

Điều gì xảy ra với cấu hình của tôi và cách tôi có thể giải quyết vấn đề này?

+0

[Bài đăng trên blog này] (http://webservices20.blogspot.nl/2008/11/introducing-wcf-clearusernamebinding.html) cung cấp câu trả lời. –

+0

Xem http://webservices20.blogspot.nl/2008/11/introducing-wcf-clearusernamebinding.html – Steven

+0

Tôi đoán bạn không muốn tắt hoàn toàn bảo mật (tạm thời tất nhiên)? Nếu bạn làm như vậy, bạn sẽ vô hiệu hóa bảo mật thư trên liên kết wshttp của bạn như sau: '' –

Trả lời

16

Bạn cần ký dịch vụ với chứng chỉ. Bạn có thể thực hiện việc này bằng cách thêm thông tin sau vào cấu hình:

<serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 

     *<serviceCredentials> 
      <serviceCertificate findValue="certificatename" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" /> 
     </serviceCredentials>* 
    </behavior> 
</serviceBehaviors> 

Nơi certificatename là tên chứng chỉ của bạn. Để tạo chứng chỉ, bạn có thể xem tại đây: Create a self signed certificate

+1

Vì đây là dịch vụ nội bộ, tôi hiện không quan tâm đến việc áp dụng bảo mật mức vận tải và tôi không muốn tạo chứng chỉ vì điều này làm phức tạp việc triển khai dịch vụ. Tôi có thể cấu hình điều này mà không cần chứng chỉ không? –

+1

Rất tiếc, bạn phải tạo chứng chỉ, ngay cả đối với thử nghiệm nội bộ. Bạn có thể tạo chứng chỉ của cơ quan cấp chứng chỉ gốc của chính mình và sau đó sử dụng chứng chỉ thứ hai này để cấp chứng chỉ thứ hai cho dịch vụ của bạn. Cả hai cần phải được cài đặt trên mỗi máy chủ bạn triển khai. – 79E09796

+0

Tôi vẫn gặp lỗi này ngay cả khi có chứng chỉ này. Đưa cái gì? – ashes999

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