• WCF SSL(应用篇-Message)-02





    1.Host 配置信息
    Message 安全模式配置
     <bindings>
          <wsHttpBinding>
            <binding  name="MessageAndUserName"   >
              <!--安全模式 为 Message  -->
              <security  mode="Message">
                <transport clientCredentialType="None"/>
                <!--客户端自定义验证 -->
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>


    行为

     <behaviors>
          <!--服务行为 运行于服务级别,适用于所有端点,负责内容如:实例化、事务、授权、审计 等-->
          <serviceBehaviors>
            <behavior name="WCFService.WCFServiceBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
              <serviceCredentials>
                <!-- mmc 命令 文件->添加/删除管理单元->证书->计算机证书 My=个人 查找名称=kfsmqoo 本地计算机 -->
                <serviceCertificate storeName="My"  x509FindType="FindBySubjectName" findValue="kfsmqoo" storeLocation="LocalMachine"/>
                <clientCertificate >
                  <authentication certificateValidationMode="None" />
                </clientCertificate>
                <!--WCFServiceCert.CustomUserNamePasswordValidator 验证类 WCFServiceCert 命名空间 -->
                <userNameAuthentication userNamePasswordValidationMode="Custom"    customUserNamePasswordValidatorType="WCFServiceCert.CustomUserNamePasswordValidator,WCFServiceCert" />
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    


    以下是控制台跟xml的相关信息。如果不清楚证书如何生成,请参照 WCF SSL(证书篇)
    Y0T%W7QE3N4P}WWIVAJB`50

    Host 下面整个 App.config

    <?xml version="1.0"?>
    <configuration>
      <system.serviceModel>
        <behaviors>
          <!--服务行为 运行于服务级别,适用于所有端点,负责内容如:实例化、事务、授权、审计 等-->
          <serviceBehaviors>
            <behavior name="WCFService.WCFServiceBehavior">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
              <serviceCredentials>
                <!-- mmc 命令 文件->添加/删除管理单元->证书->计算机证书 My=个人 查找名称=kfsmqoo 本地计算机 -->
                <serviceCertificate storeName="My"  x509FindType="FindBySubjectName" findValue="kfsmqoo" storeLocation="LocalMachine"/>
                <clientCertificate >
                  <authentication certificateValidationMode="None" />
                </clientCertificate>
                <!--WCFServiceCert.CustomUserNamePasswordValidator 验证类 WCFServiceCert 命名空间 -->
                <userNameAuthentication userNamePasswordValidationMode="Custom"    customUserNamePasswordValidatorType="WCFServiceCert.CustomUserNamePasswordValidator,WCFServiceCert" />
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <bindings>
          <wsHttpBinding>
            <binding  name="MessageAndUserName"   >
              <!--安全模式 为 Message  -->
              <security  mode="Message">
                <transport clientCredentialType="None"/>
                <!--客户端自定义验证 -->
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
    
        <services>
          <service behaviorConfiguration="WCFService.WCFServiceBehavior" name="WCFServiceCert.CertService">
            <endpoint address="WCFService" binding="wsHttpBinding"  bindingConfiguration="MessageAndUserName" contract="WCFServiceCert.ICertService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8001/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="false"/>
      </system.serviceModel>
    
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
      </startup>
    </configuration>
    


    2.ServiceContract 信息


    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; using System.IO; namespace WCFServiceCert { public class CertService : ICertService { public string GetData() { if (CustomUserNamePasswordValidator.flg_Checked == true) { return "验证通过"; } else { return "验证失败"; } } } [ServiceContract] public interface ICertService { [OperationContract(Name = "GetDataJson")] [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetData", BodyStyle = WebMessageBodyStyle.Bare)] string GetData(); } }


    2.1 我们需要继承UserNamePasswordValidator 类,服务端Message模式需要引用 DLL
    DLL 如下:
    System.IdentityModel.dll


    using
    System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IdentityModel.Selectors; using System.IdentityModel.Tokens; // <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFServiceCert.CustomUserNamePasswordValidator,WCFServiceCert" /> namespace WCFServiceCert { public class CustomUserNamePasswordValidator : UserNamePasswordValidator { public static bool flg_Checked { get; set; }
            public override void Validate(string userName, string password)
            {
                if (userName == "kfsmqoo" && password == "123456")
                {
                    flg_Checked = true;
                    Console.WriteLine("验证成功!");
                }
                else
                {
                    flg_Checked = false;
                    Console.WriteLine("验证失败!");
                }
            } 
        }
    }


    3 Client 端代码
    3.1 Client端的引用
    image


    3.2 Client 端生成的app.config


    <?
    xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICertService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="Message"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" /> </security> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:8001/WCFService" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICertService" contract="Wcf_CustomService.ICertService" name="WSHttpBinding_ICertService"> <identity> <!--客户端验证服务器的证书的编码表示形式 Base64--> <certificate encodedValue="AwAAAAEAAAAUAAAAvETLK3VQgp807ib52Hz0oQnQ0a4gAAAAAQAAAOwBAAAwggHoMIIBVaADAgECAhABEysIfmRhrUSM1FZxeuI5MAkGBSsOAwIdBQAwEjEQMA4GA1UEAxMHa2ZzbXFvbzAeFw0xNDA2MjMwMDI3MzJaFw0zOTEyMzEyMzU5NTlaMBIxEDAOBgNVBAMTB2tmc21xb28wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMX8IcsAvfSEoWcsl9b5QkEal5lk4Ml9uhFAxUApTScSwwhawyo02uNn7vw+Om6vZuupif+mzmhqZTf6t1R1s40x64gT4QjylRPFC212ZP7nQqekdUTWIIoVetb0tpkz0Anzvfe1DjDseTlTpryC6suk6/4pFPqYmUoLPFoa3eeNAgMBAAGjRzBFMEMGA1UdAQQ8MDqAEHEoWyOCGoKd77RjPKjbIjGhFDASMRAwDgYDVQQDEwdrZnNtcW9vghABEysIfmRhrUSM1FZxeuI5MAkGBSsOAwIdBQADgYEAK0tVy8ONNoQxWCFQolRAYbAZf0naY6aiyTnBEsf4aHgifK1J3A98TXoZZJV4qsEvmoBF9pEUa2KwGdit8hL3rDp/Z5JLzsabbBEc+IkK3N5VMzUTJwHCQl1P5mQX8+RdYL3xLkKqq9s6vGBi1t2v8BNzUZK41tjtJaXhlNckGbU=" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>


    3.3 客户端代码 和服务器的返回结果。


    Wcf_CustomService.CertServiceClient client = new Wcf_CustomService.CertServiceClient(); client.ClientCredentials.UserName.UserName = "abc"; client.ClientCredentials.UserName.Password = "123456"; MessageBox.Show(client.GetDataJson()); Wcf_CustomService.CertServiceClient client1 = new Wcf_CustomService.CertServiceClient(); client1.ClientCredentials.UserName.UserName = "kfsmqoo"; client1.ClientCredentials.UserName.Password = "123456"; MessageBox.Show(client1.GetDataJson());


    看看服务器的返回信息。
    image

    代码下载

  • 相关阅读:
    9.jQuery工具方法
    8.jQuery遍历索引的方法
    7.jQuery中位置坐标图形相关方法
    CentOS安装log.io
    centos7搭建frps内网穿透服务
    docker showdoc安装
    【测试基础】等价类、边界值的概念及划分
    3-14 Pandas绘图
    3-13 索引进阶
    3-12 字符串操作
  • 原文地址:https://www.cnblogs.com/kfsmqoo/p/3904463.html
Copyright © 2020-2023  润新知