程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF NetTcpBinding Transport安全模式(2) 默認安全配置

WCF NetTcpBinding Transport安全模式(2) 默認安全配置

編輯:關於.NET

新建一個類庫名為“WcfSecurityExampleServiceLibrary”的類庫項目,添加如代碼清單11-10所示的契約,其中將示例契約命名為HelloService。

代碼清單11-10  HelloService契約

using System;
    
using System.Collections.Generic;
    
using System.Linq;
    
using System.Runtime.Serialization;
    
using System.ServiceModel;
    
using System.Text;
    
     
    
namespace WcfSecurityExampleServiceLibrary
    
{
    
     [ServiceContract]
    
    public interface IHelloService
    
    {
    
        [OperationContract]
    
        string GetHello();
    
    }
    
}

代碼清單11-11是HelloService契約的實現。

using System;
    
using System.Collections.Generic;
    
using System.Linq;
    
using System.Runtime.Serialization;
    
using System.ServiceModel;
    
using System.Text;
    
     
    
namespace WcfSecurityExampleServiceLibrary
    
{
    
    public class HelloService : IHelloService
    
    {
    
        
    
        public string GetHello()
    
        {
    
             if (ServiceSecurityContext.Current != null)
    
            {
    
     
    
     
    
                if (!ServiceSecurityContext.Current.IsAnonymous)
    
                {
    
     
    
                    return "Hello:" + ServiceSecurityContext.Current.PrimaryIdentity.Name + ";type="
    
                        + ServiceSecurityContext.Current.PrimaryIdentity.AuthenticationType;
    
     
    
                }
    
                return "";
    
            }
    
            else
    
            {
    
                return "hello";
    
            }        }
    
    }
    
}

這裡采用控制台程序做自托管宿主,宿主代碼如代碼清單11-12所示。

代碼清單11-12    宿主代碼

using System;
    
using System.Collections.Generic;
    
using System.Linq;
    
using System.Text;
    
using System.ServiceModel;
    
using WcfSecurityExampleServiceLibrary;
    
     
    
namespace SimpleHost
    
{
    
    class Program
    
    {
    
        static void Main(string[] args)
    
        {
    
            ServiceHost hostForHello = new ServiceHost(typeof(HelloService));
    
            hostForHello.Open();
    
            try
    
            {
    
                while (true)
    
                {
    
     
    
                }
    
            }
    
            catch
    
            {
    
                  
    
                hostForHello.Abort();
    
            }
    
        }
    
    }
    
}

宿主配置文件如代碼清單11-13所示。

代碼清單11-13    宿主配置文件

<?xml version="1.0"?>
    
<configuration>
    
  <system.serviceModel>
    
    <services>
    
      <service name="WcfSecurityExampleServiceLibrary.HelloService" behaviorConfiguration="mex">
    
        <host>
    
          <baseAddresses>
    
            <add baseAddress="net.tcp://127.0.0.1:64567/"/>
    
          </baseAddresses>
    
        </host>
    
        <endpoint address="net.tcp://127.0.0.1:64567/HelloService" binding="netTcpBinding"
    
                  bindingConfiguration="tcpWindowsSecurity" name="helloEndPoint"
    
                  contract="WcfSecurityExampleServiceLibrary.IHelloService"/>
    
      
    
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
    
      </service>
    
    </services>
    
    <bindings>
    
     
    
      <netTcpBinding>
    
        <binding name="tcpWindowsSecurity">
    
        </binding>
    
      </netTcpBinding>
    
    </bindings>
    
     
    
    <behaviors>
    
      <serviceBehaviors>
    
        <behavior name="mex">
    
          <serviceMetadata  />
    
        </behavior>
    
      </serviceBehaviors>
    
    </behaviors>
    
  </system.serviceModel>
    
     
    
  <startup>
    
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    
  </startup>
    
</configuration>

代碼清單11-13所示的配置文件並沒有對netTcpBinding做任何的安全配置,因此一切將采用默認設置。

客戶端實現如代碼清單11-14所示。

代碼清單11-14    客戶端實現

using System;
    
using System.Collections.Generic;
    
using System.Linq;
    
using System.Text;
    
using System.ServiceModel;
    
using WcfSecurityExampleServiceLibrary;
    
     
    
namespace WcfSecurityExampleConsoleClient
    
{
    
    class Program
    
    {
    
        static void Main(string[] args)
    
        {
    
            using (ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>("helloEndPoint"))
    
            {
    
                IHelloService helloService = channelFactory.CreateChannel();
    
                using (helloService as IDisposable)
    
                {
    
                    Console.WriteLine(helloService.GetHello());
    
                              }
    
            }
    
         Console.Read();
    
        }
    
    }
    
}

查看本欄目

圖11-6的運行結果可以證明,在默認情況下,netTcpBinding采用的是Transport安全模式,憑據類型為Windows。

繼續修改客戶端的配置為代碼清單11-16所示的內容。然後啟動TcpTrace來監聽通信。

代碼清單11-16    客戶端的配置(為配合TcpTrace監聽修改)

<?xml version="1.0" encoding="utf-8" ?>
    
<configuration>
    
  <system.serviceModel>
    
    <behaviors >
    
      <endpointBehaviors>
    
        <behavior  name="ForListen">
    
          <clientVia viaUri="net.tcp://127.0.0.1:64590/HelloService"/>
    
        </behavior>
    
      </endpointBehaviors>
    
    </behaviors>
    
    <bindings>
    
         
    
     
    
      <netTcpBinding>
    
        <binding name="tcpWindowsSecurity">
    
          <!--<security mode="None"></security> -->
    
        </binding>
    
      </netTcpBinding>
    
    </bindings>
    
    <client>
    
      <endpoint name="helloEndPoint" address="net.tcp://127.0.0.1:64567/HelloService"
    
          binding="netTcpBinding" bindingConfiguration="tcpWindowsSecurity"
    
          contract="WcfSecurityExampleServiceLibrary.IHelloService" behaviorConfiguration="ForListen" />
    
    </client>
    
  </system.serviceModel>
    
     
    
</configuration>

以上代碼加粗的部分為新增的配置,配置了客戶端的轉向請求,轉向的端口“64590”為TcpTrace的監聽端口。再次運行程序,TcpTrace的監聽監聽結果如圖11-7所示。

圖11-7       監聽Transport安全模式下的默認配置

從圖11-7中可以看出,默認情況下無法看到結果的明文信息,說明對消息進行了加密。

為了更清晰的理解默認情況下NetTcpBinding的安全配置,這裡給出兩段代碼和兩個配置文件,它們實現的是相同的效果。

初始化NetTcpBinding類實例1:

NetTcpBinding netTcpBingding = new NetTcpBinding();

初始化NetTcpBinding類實例2:

NetTcpBinding netTcpBingding = new NetTcpBinding();
    
   netTcpBingding.Security.Mode = SecurityMode.Transport;
    
   netTcpBingding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    
   netTcpBingding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;

NetTcpBinding默認安全配置文件1:

<netTcpBinding>
    
        <binding name="tcpWindowsSecurity">
    
          <security>
    
          </security>
    
        </binding>
    
      </netTcpBinding>

NetTcpBinding默認安全配置文件2:

<netTcpBinding>
    
        <binding name="tcpWindowsSecurity">
    
          <security mode="Transport" >
    
            <transport 
    
protectionLevel="EncryptAndSign"
    
clientCredentialType="Windows">
    
</transport>
    
          </security>
    
        </binding>
    
      </netTcpBinding>

作者:玄魂

出處:http://www.cnblogs.com/xuanhun/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved