【问题标题】:How to enable SSL & Certificate in case WCF TCP binding在 WCF TCP 绑定的情况下如何启用 SSL 和证书
【发布时间】:2014-04-01 13:22:08
【问题描述】:

任何人都可以指导我如何在 WCF TCP 绑定的情况下启用 SSL 和证书。任何想法。

var baseAddress = "localhost";
var factory = new DuplexChannelFactory<IMyWCFService>(new InstanceContext(SiteServer.Instance));
factory.Endpoint.Address = new EndpointAddress("net.tcp://{0}:8000/".Fmt(baseAddress));
var binding = new NetTcpBinding(SecurityMode.Message);
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
factory.Endpoint.Binding = binding;
var u = factory.Credentials.UserName;
u.UserName = userName;
u.Password = password;
return factory.CreateChannel();

谢谢

【问题讨论】:

    标签: wcf ssl tcp certificate


    【解决方案1】:

    MessageCredentialType 是一个枚举。您可以设置 MessageCredentialType.Certificate 并设置证书凭据。您应该查看MessageCredentialType enum 的文档,您可以在其中找到设置证书凭据的示例。

    我用这个例子来验证它是否有效。整个程序看起来像

    using System;
    using System.ServiceModel;
    
    namespace ConsoleApplication2
    {
        [ServiceContract(Namespace = "http://UE.ServiceModel.Samples")]
        public interface ICalculator
        {
            [OperationContract(IsOneWay = false)]
            double Add(double n1, double n2);
    
            [OperationContract(IsOneWay = false)]
            double Subtract(double n1, double n2);
    
            [OperationContract(IsOneWay = false)]
            double Multiply(double n1, double n2);
    
            [OperationContract(IsOneWay = false)]
            double Divide(double n1, double n2);
        }
    
        public class CalculatorService : ICalculator
        {
            public double Add(double n1, double n2)
            {
                double result = n1 + n2;
                Console.WriteLine("Received Add({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Subtract(double n1, double n2)
            {
                double result = n1 - n2;
                Console.WriteLine("Received Subtract({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Multiply(double n1, double n2)
            {
                double result = n1 * n2;
                Console.WriteLine("Received Multiply({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Divide(double n1, double n2)
            {
                double result = n1 / n2;
                Console.WriteLine("Received Divide({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
        }
    
    
        public class Client : ClientBase<ICalculator>, ICalculator
        {
    
            public double Add(double n1, double n2)
            {
                return base.Channel.Add(n1, n2);
            }
    
            public double Subtract(double n1, double n2)
            {
                throw new NotImplementedException();
            }
    
            public double Multiply(double n1, double n2)
            {
                throw new NotImplementedException();
            }
    
            public double Divide(double n1, double n2)
            {
                throw new NotImplementedException();
            }
        }
    
        internal class Program
        {
            private static void Main(string[] args)
            {
                ServiceHost myServiceHost = new ServiceHost(typeof(CalculatorService));
    
                // Open the ServiceHostBase to create listeners and start listening for messages.
                myServiceHost.Open();
    
                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
    
                Client c = new Client();
                var res = c.Add(1, 2);
    
                Console.ReadLine();
            }
    
        }
    }
    

    我的配置文件是这样的

        <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
      <system.serviceModel>
        <client>
          <endpoint address="net.tcp://localhost:8000/servicemodelsamples/service/calc" binding="netTcpBinding" contract="ConsoleApplication2.ICalculator" behaviorConfiguration="net" >
            <identity>
              <dns value="localhost"/>
            </identity>
          </endpoint>
        </client>
        <services>
          <service name="ConsoleApplication2.CalculatorService" behaviorConfiguration="service">
            <endpoint address="net.tcp://localhost:8000/servicemodelsamples/service/calc" binding="netTcpBinding" contract="ConsoleApplication2.ICalculator" >
              <identity>
                <dns value="localhost"/>
              </identity>
            </endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="net.tcp://localhost:8000/servicemodelsamples/service" />
              </baseAddresses>
            </host>
          </service>
    
        </services>
        <bindings>
          <netTcpBinding>
            <binding>
              <security mode="Message">
                <message clientCredentialType="Certificate"/>
              </security>
            </binding>
          </netTcpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="service">
              <serviceCredentials>
                <serviceCertificate findValue="localhost" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
          <endpointBehaviors>
            <behavior name="net">
              <clientCredentials>
                <clientCertificate findValue="localhost" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

    它对我有用。

    【讨论】:

    • 我问我何时使用 tcp 绑定托管我的 wcf 服务,然后如何为我的 wcf 服务启用 ssl。是否可以通过 tcp 绑定为 wcf 服务启用 ssl?
    • 几分钟前我试过了。我会在一分钟内用整个例子更新我的答案。
    • 嗯,可能我没听懂。您问题中的代码使用消息安全性,所以我同意了。我没有尝试在示例中使用传输安全性,所以我不能确定它是否会起作用。
    • 为什么配置文件中存在两种行为,因为我发现了一种用于 serviceBehaviors,另一种用于 endpointBehaviors。请讨论为什么你指定两种行为?
    • 一种行为是针对服务的,它定义了服务应该使用什么证书。其他用于客户端端点并定义客户端应使用的证书。在现实世界的场景中,您不会在同一个配置中同时拥有这两种行为。我只是懒得为 wcf 客户端创建一个新项目,并将代码和配置放在同一个 project/app.config 中。
    猜你喜欢
    • 2012-06-07
    • 2017-10-10
    • 2014-04-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2011-09-13
    相关资源
    最近更新 更多