Servizio WCF SecurityNegotiationException
Domanda
Sono in esecuzione di un semplice servizio sul mio server con WCF;il servizio è ospitato in WebDev.WebServer.exe (locale).
Quando chiamo il Servizio locale ottengo la seguente eccezione:
Eccezione Non Gestita:Sistema.ServiceModel.Di sicurezza.SecurityNegotiationException:Canale sicuro non può essere aperto perché la sicurezza di negoziazione con l'endpoint remoto non riuscita.Questo può essere a causa di assenza o specificato in modo non corretto EndpointIdentity in EndpointAddress utilizzato per creare il canale.Si prega di verificare la EndpointIdentity specificata o implicita EndpointAddress identifica correttamente l'endpoint remoto.---> Sistema.ServiceModel.FaultException:Il messaggio con l'Azione 'http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue'non può essere trattati al ricevitore, a causa di una mancata corrispondenza ContractFilter in EndpointDispatcher.Ciò potrebbe essere causa di una mancata corrispondenza del contratto (non corrispondenti Azioni tra mittente e destinatario) o un'associazione di protezione/di mancata corrispondenza tra il mittente e il ricevitore.Controllare che mittente e destinatario abbiano lo stesso contratto e la stessa associazione (inclusi i requisiti di sicurezza, ad es.Messaggio Di Trasporto, Nessuno).
Qui sono i miei due app.i file di configurazione dal client e il server.Ho fatto l'app.config dal client con il svcutil-Strumento così dovrebbe essere giusto:
Client
<client>
<endpoint address="http://localhost:1634/UsuarioContexto.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IUsuarioContexto"
contract="CarWin.ServiceContracts.Interfaces.IUsuarioContexto" name="LOCAL_WSHttpBinding_IUsuarioContexto">
<identity><dns value="localhost" /></identity>
</endpoint>
</client>
<binding name="WSHttpBinding_IUsuarioContexto" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
Server
<services>
<service behaviorConfiguration="UsuarioContextoBehavior" name="UserContext.Host.UsuarioContexto">
<endpoint address="" binding="wsHttpBinding" bindingNamespace="http://CarWin" bindingConfiguration="wsHttpBinding_IUsuarioContexto"
contract="CarWin.ServiceContracts.Interfaces.IUsuarioContexto">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding_IUsuarioContexto" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="UsuarioContextoBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
Soluzione
Il problema era in assistente, ho messo la modalità = "Messaggio" e funziona bene. grazie.
<security mode="None">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />
</security>
Altri suggerimenti
WCF è molto potente, ma può essere una config incubo.Qui ci sono alcuni potenziali lead:
- Accendere il WCF registri di traccia, eseguire nuovamente il vostro scenario e poi controllare i log con SvcTraceViewer.exe
- Capire fino a che punto la messaggistica diventa...
- cioèil cliente modulo di richiesta e inviarlo al server che la rifiuta (es.in basso a WCF livelli di prima il tuo codice di servizio è il colpo);
- o la richiesta di ottenere fermato nella sua tracce prima che..il client non anche l'invio della richiesta
- http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue è un WS-Trust token relativo messaggio, quindi ci sarà qualcosa che non va con l'autenticazione
- l'errore è che implica che c'è una config di mancata corrispondenza, ma utilizzando SvcUtil dovrebbe averli allineati come hai detto
- Il client associazione ha il server "http://localhost:1634/UsuarioContexto.svc"
- Non vedo che la porta specificata nella configurazione del servizio...il servizio è in ascolto su quella porta?
- se si apre un browser e l'obiettivo è quello di URL, si ottiene un servizio predefinito pagina?