//#define USE_MSG_BINDING using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Channels; using System.ServiceModel; using System.Security.Cryptography.X509Certificates; using System.Net; namespace HeuristicLab.Hive.Contracts { public static class WcfSettings { public const string SERVERCERT = "HIVE-Server"; public const int DEFAULTPORT = 9000; /// /// Gets a pre-defined binding using TCP for secure transport. /// /// A binding type of public static Binding GetBinding() { #if USE_MSG_BINDING NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message); #else NetTcpBinding binding = new NetTcpBinding(); #endif binding.MaxBufferSize = int.MaxValue; binding.MaxReceivedMessageSize = int.MaxValue; binding.ReaderQuotas.MaxArrayLength = int.MaxValue; binding.ReaderQuotas.MaxStringContentLength = int.MaxValue; binding.CloseTimeout = new TimeSpan(0, 5, 0); binding.ReceiveTimeout = new TimeSpan(0, 5, 0); binding.SendTimeout = new TimeSpan(0, 5, 0); return binding; } /// /// Defines the used certificate for authentification located in a certification store. /// /// A service for which this certificate is applicable. public static void SetServiceCertificate(ServiceHost svchost) { #if USE_MSG_BINDING svchost.Credentials.ServiceCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, SERVERCERT); #endif } /// /// Gets the currently active IP address. /// If more than one IP connections is active, the first one will be used. /// /// public static string GetActiveIP() { return System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections()[0].LocalEndPoint.Address.ToString(); } /// /// Gets the default port used for HIVE services. /// /// public static int GetDefaultPort() { return DEFAULTPORT; } } /// /// This class verifies the certificate defined by method. Normally, /// the verification process is managed by the underlying operating system. /// /// /// WARNUNG: Dieser Code wird nur für Testzertifikate benötigt, wie sie beispielsweise von makecert erstellt werden. /// Sie sollten diesen Code nicht in einer Produktionsumgebung verwenden. /// public class PermissiveCertificatePolicy { string subjectName; static PermissiveCertificatePolicy currentPolicy; PermissiveCertificatePolicy(string subjectName) { this.subjectName = subjectName; ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(RemoteCertValidate); } public static void Enact(string subjectName) { currentPolicy = new PermissiveCertificatePolicy(subjectName); } bool RemoteCertValidate(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error) { if (cert.Subject == subjectName) { return true; } return false; } } }