Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -573,4 +573,67 @@ public static void WebSocket_ServerCertificateValidation()
}
}

// Regression test for https://github.com/dotnet/wcf/issues/5729
// Verifies that a custom RemoteCertificateValidationCallback (configured via
// ClientCredentials.ServiceCertificate.SslCertificateAuthentication) is invoked
// during the WebSocket handshake even when no client certificate is required.
// Prior to the fix, the callback was only wired when RequireClientCertificate
// was true, so this scenario silently fell back to default validation.
[WcfFact]
[Condition(nameof(Root_Certificate_Installed),
nameof(SSL_Available),
nameof(Skip_CoreWCFService_FailedTest))]
[Issue(3572, OS = OSID.OSX)]
[Issue(1438, OS = OSID.Windows_7)] // not supported on Win7
[OuterLoop]
public static void WebSocket_ServerCertificateValidation_NoClientCertificate()
{
EndpointAddress endpointAddress;
NetHttpsBinding binding = null;
ChannelFactory<IWSRequestReplyService> factory = null;
IWSRequestReplyService serviceProxy = null;

try
{
// *** SETUP *** \\
binding = new NetHttpsBinding(BasicHttpsSecurityMode.Transport)
{
MaxReceivedMessageSize = ScenarioTestHelpers.SixtyFourMB,
MaxBufferSize = ScenarioTestHelpers.SixtyFourMB,
};
binding.WebSocketSettings.TransportUsage = WebSocketTransportUsage.Always;
binding.TransferMode = TransferMode.Buffered;
// Intentionally do NOT set Security.Transport.ClientCredentialType = Certificate;
// this is the scenario from issue #5729 where the custom validator was being ignored.
endpointAddress = new EndpointAddress(Endpoints.WebSocketHttpsRequestReplyBuffered_Address + Enum.GetName(typeof(NetHttpMessageEncoding), NetHttpMessageEncoding.Binary));

factory = new ChannelFactory<IWSRequestReplyService>(binding, endpointAddress);
factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication();
factory.Credentials.ServiceCertificate.SslCertificateAuthentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
MyX509CertificateValidator myX509CertificateValidator = new MyX509CertificateValidator(ScenarioTestHelpers.CertificateIssuerName);
factory.Credentials.ServiceCertificate.SslCertificateAuthentication.CustomCertificateValidator = myX509CertificateValidator;

serviceProxy = factory.CreateChannel();

// *** EXECUTE *** \\
// Triggers the WebSocket handshake, which is where the SSL certificate validation callback must run.
string result = serviceProxy.DownloadData();

// *** VALIDATE *** \\
Assert.True(myX509CertificateValidator.validateMethodWasCalled,
"The custom X509CertificateValidator was NOT called during the WebSocket handshake. " +
"This indicates the SslCertificateAuthentication callback was not wired when RequireClientCertificate is false (regression of #5729).");
Assert.False(string.IsNullOrEmpty(result), "DownloadData returned an empty result.");

// *** CLEANUP *** \\
((ICommunicationObject)serviceProxy).Close();
factory.Close();
}
finally
{
// *** ENSURE CLEANUP *** \\
ScenarioTestHelpers.CloseCommunicationObjects((ICommunicationObject)serviceProxy, factory);
}
}

}
15 changes: 15 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/Strings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -363,4 +363,19 @@
<data name="WebSocketInvalidProtocolNotInClientList" xml:space="preserve">
<value>The subprotocol '{0}' was not requested by the client. The client requested the following subprotocol(s): '{1}'.</value>
</data>
<data name="net_WebSockets_AcceptUnsupportedProtocol" xml:space="preserve">
<value>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</value>
</data>
<data name="net_webstatus_ConnectFailure" xml:space="preserve">
<value>Unable to connect to the remote server</value>
</data>
<data name="net_WebSockets_ConnectStatusExpected" xml:space="preserve">
<value>The server returned status code '{0}' when status code '{1}' was expected.</value>
</data>
<data name="net_WebSockets_MissingResponseHeader" xml:space="preserve">
<value>The server's response was missing the required header '{0}'.</value>
</data>
<data name="net_WebSockets_InvalidResponseHeader" xml:space="preserve">
<value>The '{0}' header value '{1}' is invalid.</value>
</data>
</root>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.cs.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">Server nepřijal žádost o připojení. Verze protokolu WebSocket na straně klienta se pravděpodobně neshoduje s nastavením na straně serveru ({0}).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.de.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">Der Server hat die Verbindungsanforderung nicht akzeptiert. Möglicherweise stimmt die Version des WebSocket-Protokolls auf dem Client nicht mit der auf dem Server ("{0}") überein.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.es.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">El servidor no aceptó la solicitud de conexión. Es posible que la versión del subprotocolo WebSocket de su cliente no coincida con el del servidor ("{0}").</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.fr.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">Le serveur a refusé la demande de connexion. Il est possible que la version du protocole WebSocket sur votre client ne corresponde pas à la version située sur le serveur ('{0}').</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.it.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">Il server non ha accettato la richiesta di connessione. È possibile che la versione del protocollo WebSocket nel client non corrisponda a quella nel server ('{0}').</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.ja.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">サーバーが接続要求を受け入れませんでした。クライアントの WebSocket プロトコルのバージョンが、サーバー ('{0}') のものと一致していない可能性があります。</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.ko.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">서버에서 연결 요청을 수락하지 않았습니다. 클라이언트의 WebSocket 프로토콜 버전이 서버의 프로토콜 버전('{0}')과 일치하지 않을 수 있습니다.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
25 changes: 25 additions & 0 deletions src/System.ServiceModel.Http/src/Resources/xlf/Strings.pl.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,31 @@
<target state="translated">Serwer nie zaakceptował żądania połączenia. Być może wersja protokołu WebSocket używana przez klienta jest niezgodna z wersją używaną przez serwer („{0}”).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_AcceptUnsupportedProtocol">
<source>The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</source>
<target state="new">The WebSocket client request requested '{0}' protocol(s), but server is only accepting '{1}' protocol(s).</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_ConnectStatusExpected">
<source>The server returned status code '{0}' when status code '{1}' was expected.</source>
<target state="new">The server returned status code '{0}' when status code '{1}' was expected.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_InvalidResponseHeader">
<source>The '{0}' header value '{1}' is invalid.</source>
<target state="new">The '{0}' header value '{1}' is invalid.</target>
<note />
</trans-unit>
<trans-unit id="net_WebSockets_MissingResponseHeader">
<source>The server's response was missing the required header '{0}'.</source>
<target state="new">The server's response was missing the required header '{0}'.</target>
<note />
</trans-unit>
<trans-unit id="net_webstatus_ConnectFailure">
<source>Unable to connect to the remote server</source>
<target state="new">Unable to connect to the remote server</target>
<note />
</trans-unit>
</body>
</file>
</xliff>
Loading