2012-03-07 37 views
13

Estoy intentando crear un servicio WCF que utiliza el MembershipProvider para la autenticación. Debido a que es un servicio interno, actualmente no estoy interesado en aplicar seguridad de nivel de transporte (HTTPS) y quiero (por ahora) hacer esto sin un certificado. Además, esto complicará el despliegue del servicio y deseo hacerlo en un momento posterior. He construido una configuración básica (incluso sin configurar el MembershipProvider, pero WCF que me hace tirar la siguiente excepción:.WCF: El certificado de servicio no se proporciona. Especifique un certificado de servicio en ServiceCredentials

No se proporciona el certificado de servicio designar un certificado de servicio en ServiceCredentials

. aquí está mi configuración:

<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 de la excepción:

[InvalidOperationException: no se proporciona el certificado de servicio. Especifique un certificado de servicio en ServiceCredentials. ]
System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateServerX509TokenProvider() 12382737 System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateLocalSecurityTokenProvider (RecipientServiceModelSecurityTokenRequirement recipientRequirement) 63
System.ServiceModel.Security.ServiceCredentialsSecurityTokenManager.CreateSecurityTokenProvider (SecurityTokenRequirement requisito) + 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) 12383208 System.ServiceModel.Security.SessionRenewSecurityTokenManager .CreateSecurityTokenAuthenticator (SecurityTokenRequirement tokenRequirement, SecurityTokenResolver & outOfBandTokenResolver) +81
System.S erviceModel.Security.SymmetricSecurityProtocolFactory.OnOpen (TimeSpan tiempo de espera) 181
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (TimeSpan tiempo de espera) 21
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) 318
System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open (TimeSpan tiempo de espera) 94
System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen (TimeSpan tiempo de espera) 240
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan timeo ut) +318
System.ServiceModel.Dispatcher.ChannelDispatcher.AlAbrir (TimeSpan tiempo de espera) 72

[InvalidOperationException: El ChannelDispatcher en 'http: // localhost: 9800/Service1.svc' con un contrato (s) ' "IssueAndRenewSession"' no es capaz de abrir su IChannelListener. ]
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan tiempo de espera) 118
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) 318 System.ServiceModel.ServiceHostBase.OnOpen (TimeSpan tiempo de espera) + 111
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) 318
System.ServiceModel.Security.SecuritySessionSecurityTokenAuthenticator.OnOpen (TimeSpan tiempo de espera) 131
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (TimeSpan tiempo de espera) 21
System.ServiceModel.Channels.CommunicationObject .Open (TimeSpan tiempo de espera) 318
System.ServiceModel.Security.CommunicationObjectSecurityTokenAuthenticator.Open (TimeSpan tiempo de espera) 20
System.ServiceModel.Security.SecuritySessionServerSettings.OnOpen (TimeSpan tiempo de espera) 792
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen (TimeSpan tiempo de espera) 21
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) 318
System.ServiceModel.Security.SecurityListenerSettingsLifetimeManager.Open (TimeSpan tiempo de espera) 148
System.ServiceModel.Channels.SecurityChannelListener`1.OnOpen (TimeSpan tiempo de espera) 240
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) 318
System.ServiceModel.Dispatcher.ChannelDispatcher .OnOpen (TimeSpan tiempo de espera) 72

[InvalidOperationException: El ChannelDispatcher en 'http: // localhost: 9800/Service1.svc' con un contrato (s) ' "IService1"' es no puede abrir su IChannelListener.]
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan tiempo de espera) 118
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) 318 System.ServiceModel.ServiceHostBase.OnOpen (TimeSpan tiempo de espera) 111
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan tiempo de espera) +318
System.ServiceModel.HostingManager.ActivateService (String normalizedVirtualPath) 206
System.ServiceModel.HostingManager.EnsureServiceAvailable (String normalizedVirtualPath) 651

[ServiceActivationException: El servicio '/Service1.svc' no puede ser activado debido a una excepción durante la compilación. El mensaje de excepción es: El ChannelDispatcher en 'http: // localhost: 9800/Service1.svc' con un contrato (s) ' "IService1"' es no puede abrir su IChannelListener ..]
System.Runtime.AsyncResult .Fin (resultado IAsyncResult) 688590
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End (IAsyncResult resultado) 190
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous (HttpApplication contexto, Cadena routeServiceVirtualPath, Boolean flowContext, Boolean ensureWFService) 234
System.ServiceModel.Activation.HttpModule.ProcessRequest (Object remitente, EventArgs e) 359
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 148 System.Web. HttpApplication.ExecuteStep (paso IExecutionStep, Boolean & comp de forma sincronizada) +75

¿Qué hay de malo en mi configuración y cómo puedo solucionar esto?

+0

[Esta publicación del blog] (http://webservices20.blogspot.nl/2008/11/introducing-wcf-clearusernamebinding.html) da la respuesta. –

+0

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

+0

Supongo que no desea deshabilitar por completo la seguridad (temporalmente, por supuesto)? Si lo hace, deshabilitaría la seguridad del mensaje en su enlace wshttp de la siguiente manera: '' –

Respuesta

16

Debe firmar el servicio con un certificado. Puede hacerlo agregando lo siguiente a la configuración:

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

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

Donde nombre_certificado es el nombre de su certificado. Para crear un certificado, puede mirar aquí: Create a self signed certificate

+1

Debido a que es un servicio interno, actualmente no estoy interesado en aplicar seguridad de nivel de transporte y no lo hago quiero crear un certificado, porque esto complica el despliegue del servicio. ¿Puedo configurar esto sin un certificado? –

+1

No desafortunadamente tiene que crear un certificado, incluso para pruebas internas. Puede crear su propio certificado de autoridad de certificación de nivel raíz y luego usarlo para emitir un segundo certificado para su servicio. Ambos deben instalarse en cada servidor que implemente. – 79E09796

+0

Todavía obtengo este error incluso con este certificado presente. ¿Lo que da? – ashes999

Cuestiones relacionadas