开发者社区> zting科技> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

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

新建一个类库名为“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-11HelloService契约实现。

代码清单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-14所示实现中,首先根据配置文件创建服务管道,然后请求服务GetHello方法,输出结果。客户端配置文件,如代码清单11-15所示。

代码清单11-15    客户端配置文件

<?xml version="1.0" encoding="utf-8" ?>

<configuration>       

  <system.serviceModel>

    <bindings>

      <netTcpBinding>

        <binding name="tcpWindowsSecurity">

        </binding>

      </netTcpBinding>

    </bindings>

    <client>

      <endpoint name="helloEndPoint" address="net.tcp://127.0.0.1:64567/HelloService" 

          binding="netTcpBinding" bindingConfiguration="tcpWindowsSecurity"

          contract="WcfSecurityExampleServiceLibrary.IHelloService" />

    </client>

  </system.serviceModel>

</configuration>

从代码清单11-15配置文件中,可以看出客户所有安全配置仍然采用默认配置。

在运行代码之前,对代码清单11-12中用到ServiceSecurityContext对象做简要说明。

ServiceSecurityContext对象用于表示安全调用上下文。安全调用上下文保存在TLS中,沿着服务调用链向下,每个对象每个方法都可以访问当前安全调用上下文。获得上下文方法很简单,只需要访问ServiceSecurityContext对像Current属性。这里需要注意ServiceSecurityContext对象两个属性:PrimaryIdentity属性和WindowsIdentity属性。PrimaryIdentity属性包含了调用链最终客户端身份,如果客户端未通过验证,该属性会被置一个空白身份,如果是Windows身份验证,那么会被赋予一个WindowsIdentity实例。WindowsIdentity属性只有在采用Windows身份验证时有效。

启动代码清单11-12所示WCF宿主和代码清单11-14所示客户端,运行结果如图11-6所示。

图11-6        HelloService测试结果

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>

 ---------------------------------注:本文部分内容改编自《.NET 安全揭秘》



本文转自玄魂博客园博客,原文链接:http://www.cnblogs.com/xuanhun/archive/2012/06/24/2560047.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[解题报告]《算法零基础100讲》(第46讲) 位运算 (异或) 入门
[解题报告]《算法零基础100讲》(第46讲) 位运算 (异或) 入门
22 0
企业上云基础框架设计
在持续了多年的上云浪潮中,许多企业享受到了云计算带来的红利,也在云计算时代逐渐成长,业务与体量都得到了飞速的发展。然而随着企业的发展,企业所面临的问题也在不断产生着变化,本文将着重讨论一下如何更好的应对企业在阿里云上多业务多账号的统筹管理问题。
86 0
通知:前blog文章全丢了..
因为某机构视频版权问题..我博客被迫被封..     现已解封,不过文章丢了...
485 0
log4j配置与说明
log4j配置与说明      在网上搜了一些资料,整理出如下内容: (一)各种应用例子: log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.
855 0
Debug 资料大全(转贴)
Debug 资料大全Debug-PC之开山老祖  Debug 原意是杀虫子。这里是机器调试工具。  其实,Debug的由来,还有一则趣闻,在早期美国的一计算机房中,科学家正在紧张的工作。同时,许多台大型的计算机也在不停的运行着。
862 0
+关注
3549
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载