winform+wcf(netTcpBinding)双向通讯 自定义用户名密码验证

来源:互联网 发布:excel数据挖掘插件 编辑:程序博客网 时间:2024/06/05 18:35


一:创建证书     

       使用vs的命令创建

        makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=TestServer -sky exchange -pe

      创建证书细节http://blog.csdn.net/aojiancc2/article/details/17711925      


二:wcf服务器端

       

namespace WcfCertificate{    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ITcpCer”。     [ServiceContract(CallbackContract = typeof(ICallback))]//指定UserCallBack回调接口    public interface ITcpCer    {        [OperationContract]        void DoWork();    }    public interface ICallback  //回调接口客服端实现    {        [OperationContract(IsOneWay = true)]//单向调用,不需要返回值        void TestCallBack(string hello);    }}
namespace WcfCertificate{    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“TcpCer”。    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 TcpCer.svc 或 TcpCer.svc.cs,然后开始调试。    public class TcpCer : ITcpCer    {        public void DoWork()        {            OperationContext.Current.GetCallbackChannel<ICallback>().TestCallBack("回调了");        }    }}

配置文件

<?xml version="1.0" encoding="utf-8"?><configuration>  <appSettings>    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />  </appSettings>  <system.web>    <compilation debug="true" targetFramework="4.5" />    <httpRuntime targetFramework="4.5"/>  </system.web>  <system.serviceModel>        <behaviors>      <serviceBehaviors>        <behavior name="mybehavior">          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />          <serviceDebug includeExceptionDetailInFaults="false" />          <serviceCredentials>            <clientCertificate>              <authentication certificateValidationMode="None" />            </clientCertificate>            <serviceCertificate findValue="TestServer" storeLocation="LocalMachine"              storeName="My" x509FindType="FindBySubjectName" />            <userNameAuthentication userNamePasswordValidationMode="Custom"              customUserNamePasswordValidatorType="WcfCertificate.Validator,WcfCertificate" />          </serviceCredentials>        </behavior>      </serviceBehaviors>    </behaviors>     <bindings>       <netTcpBinding>         <binding name="netTcpBindConfig" receiveTimeout="00:20:00">           <security mode="Message">             <message clientCredentialType="UserName"  />           </security>         </binding>       </netTcpBinding>           </bindings>    <services>      <service name="WcfCertificate.TcpCer" behaviorConfiguration="mybehavior">        <endpoint address="" binding="netTcpBinding"  bindingConfiguration="netTcpBindConfig" contract="WcfCertificate.ITcpCer"/>        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>      </service>        </services>        <protocolMapping>        <add binding="basicHttpsBinding" scheme="https" />    </protocolMapping>        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />  </system.serviceModel>  <system.webServer>    <modules runAllManagedModulesForAllRequests="true"/>    <!--        若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。        在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。      -->    <directoryBrowse enabled="true"/>  </system.webServer></configuration>

三:客服端

namespace wfTcpCer{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            ServiceReference1.TcpCerClient tc = new ServiceReference1.TcpCerClient(                new System.ServiceModel.InstanceContext(new CallBack()));            tc.ClientCredentials.UserName.UserName = "sa";            tc.ClientCredentials.UserName.Password = "1234";            tc.DoWorkAsync();//有回调函数用异步调用方式        }        public class CallBack : ServiceReference1.ITcpCerCallback //回调接口        {            public void TestCallBack(string hello)             {                MessageBox.Show("text callback");            }        }    }}
配置文件

<?xml version="1.0" encoding="utf-8" ?><configuration>    <startup>         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />    </startup>    <system.serviceModel>        <bindings>            <netTcpBinding>                <binding name="NetTcpBinding_ITcpCer">                    <security mode="Message">                        <message clientCredentialType="UserName" />                    </security>                </binding>            </netTcpBinding>        </bindings>        <client>            <endpoint address="net.tcp://2011-20130817ae:4503/TcpCer.svc"                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ITcpCer"                contract="ServiceReference1.ITcpCer" name="NetTcpBinding_ITcpCer">                <identity>                    <!--这个是自动生成的,也可以用下边的dns value="TestServer"因为certificateValidationMode="None"不需要验证证书-->                    <certificate encodedValue="AwAAAAEAAAAUAAAA3j+VKPLILWzCfoG9VXc2yhchi+kgAAAAAQAAADoCAAAwggI2MIIB5KADAgECAhDmLEMHisejr0j4qDS+rn+HMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMTMxMjMxMDM0MjE4WhcNMzkxMjMxMjM1OTU5WjAVMRMwEQYDVQQDEwpUZXN0U2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtXJzwFZrUgBRsLu5c8wt0iEwj/EcI9IFHK8tAraRtKsLtoWi3CHxrwi39rNaWh0SN11w8QX+0rEwAdxoxppGPPTTMbRMlcUHWHZ8oTn5V66nzYds0X2tt993KV0k1YX1ZXDuA37LZFROwksqCYfsl2sAenVkiLizzjrMVaIUPuzVvaphpxd+KcivPAYdNW/tCgC1vracULEVnu+86uPhyT9dUykIByB4rhbR0EHUNuw/4CtTsx+a3Wqn/vhPgjy08nxx+wfB/ekJmNnoz0cNVobq4WOpExDNZdGrrow9qVMcIvcGj53vGb4BhzdCwZWzf0U/K3LAJEqg+2/P+HlcPwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBABjcWxmn9cVILyozv4cVvGQJ6ZfAen7pHI1MV1dZ/YhJHd1Ou6dHHafAI3755TyY7gpEHPu4xuRN6eXwYg2FkvI=" />                    <!--<dns value="TestServer"/>-->                </identity>            </endpoint>        </client>      <behaviors>        <endpointBehaviors>          <behavior name="mye">            <clientCredentials>              <serviceCertificate>                <!--这里必须要制定为None-->                <authentication certificateValidationMode="None"/>              </serviceCertificate>            </clientCredentials>          </behavior>        </endpointBehaviors>      </behaviors>          </system.serviceModel></configuration>




0 0