1.创建WCF服务应用以及调用客户端(请自行google)。 

2.创建X509证书

      cmd 进入  C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\

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

  

下面是各种参数的介绍

属性

解析

-sr

指定的证书存储区中的注册表位置。 
currentUser 
指定注册版存储位置为 HKEY_CURRENT_USER. 
localMachine 
指定注册版存储位置为 HKEY_LOCAL_MACHINE.

-ss

指定证书存储的位置。

-a

指定相关的算法,可以选择 MD5 算法或者 SHA1算法

-n

指定证书的名称。该名称遵循X.500命名标准。简单例子如 "CN=MyName" 格式,如果没有指定/n开关,证书默认的名称是"Joe's Software Emporium"。

-sky

证书键类型。可以设置为 exchange 或者 signature。

-pe

证书可导出

 

    出现succeeded说明证书创建成功。

    查看证书:

1.win+r==>mmc==>确定 打开控制台
2.文件==>添加/删除管理单元==>证书==>添加==>我的用户账户==>完成==>添加==>计算机账户==>下一步==>完成==>确定

导出证书:

此处务必选择是,导出私钥,设置密码导出即可,

证书(本地计算机)==>受信任的根证书颁发机构==>证书==>所有任务==>导入==>下一步==>选择证书==>输入密码==>下一步==>完成

3.为WCF服务添加自定义验证 (添加一个继承UserNamePasswordValidator的类并重写Validate)

 

 // 自定义的用户名/密码验证类
     /// </summary>
     public class CustomNamePasswordValidator : System.IdentityModel.Selectors.UserNamePasswordValidator
     {
         /// <summary>
         /// 验证指定的用户名和密码
         /// </summary>
         /// <param name="userName">要验证的用户名</param>
         /// <param name="password">要验证的密码</param>
         public override void Validate(string userName, string password)
         {
             if (!(userName == "xxx" && password == "xxx"))
             {
                 throw new FaultException("用户名或密码不正确");
             }
         }
     }

4.为WCF宿主添加如下Config配置

 <system.serviceModel>
     <services>
       <!--name - 提供服务的类名-->
       <!--behaviorConfiguration - 指定相关的行为配置-->
       <service name="ZhiHeng.JinJiBox.Service.Api" behaviorConfiguration="SecurityBehavior">
         <!--address - 服务地址-->
         <!--binding - 通信方式-->
         <!--contract - 服务契约-->
         <endpoint address="" binding="wsHttpBinding" contract="ZhiHeng.JinJiBox.Service.IApi" bindingConfiguration="SecurityBindingConfiguration"  />
         <host>
           <baseAddresses>
             <add baseAddress="http://localhost:8000/CardOper" />
           </baseAddresses>
         </host>
       </service>
     </services>
     <behaviors>
       <serviceBehaviors>
         <behavior name="SecurityBehavior">
           <!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false-->
           <serviceMetadata httpGetEnabled="true" />
           <serviceDebug includeExceptionDetailInFaults="true"/>
           <serviceCredentials>
             <!--userNamePasswordValidationMode - 以用户名/密码模式来进行验证的方法-->
             <!--UserNamePasswordValidationMode.Windows - 用户名映射到 Windows 用户-->
             <!--UserNamePasswordValidationMode.MembershipProvider - 提供基于已配置的 MembershipProvider 的密码验证-->
             <!--UserNamePasswordValidationMode.Custom - 基于已配置的自定义 UsernamePasswordValidator 的自定义身份验证-->
             <!--customUserNamePasswordValidatorType - 所使用的自定义用户名密码验证程序的类型-->
             <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="ZhiHeng.JinJiBox.Service.CustomNamePasswordValidator, ZhiHeng.JinJiBox.Service" />
             <!--findValue - 指定要在 X.509 证书存储区中搜索的值-->
             <!--storeLocation - 指定客户端可用于验证服务器证书的证书存储区位置(LocalMachine - 分配给本地计算机的 X.509 证书存储区;CurrentUser - 当前用户使用的 X.509 证书存储区)-->
             <!--storeName - 要打开的 X.509 证书存储区的名称(参看:StoreName枚举。AddressBook, AuthRoot, CertificateAuthority, Disallowed, My, Root, TrustedPeople, TrustedPublisher)-->
             <!--x509FindType - 要执行的 X.509 搜索的类型(参看:X509FindType枚举)-->
             <serviceCertificate findValue="JJWcfService" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
           </serviceCredentials>
         </behavior>
       </serviceBehaviors>
     </behaviors>
     <bindings>
       <wsHttpBinding>
         <binding name="SecurityBindingConfiguration">
           <security>
             <!--clientCredentialType - 客户端用以进行身份验证的凭据的类型,默认值 UserName -->
             <!--BasicHttpMessageCredentialType.UserName - 使用用户名凭据对客户端进行身份验证-->
             <!--BasicHttpMessageCredentialType.Certificate - 使用证书对客户端进行身份验证-->
             <message clientCredentialType="UserName" />
           </security>
         </binding>
       </wsHttpBinding>
     </bindings>
   </system.serviceModel>

启动WCF服务端。

5.生成WCF客户端Config配置

  vs==>工具==>外部工具==>添加==>标题SvcUtil,命令C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\SvcUtil.exe,初始目录$(SolutionDir)==>应用,确定==>工具==>SvcUtil==>参数输入WCF的服务地址,不出意外会在项目跟目录生成2个文件,将代理文件拷贝到WCF客户端,将配置文件拷贝到客户端配置文件中

 <system.serviceModel>
         <bindings>
             <wsHttpBinding>
                 <binding name="WSHttpBinding_IApi" 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" establishSecurityContext="true" />
                     </security>
                 </binding>
             </wsHttpBinding>
         </bindings>
         <client>
             <endpoint address="http://localhost:8000/CardOper" binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_IApi" contract="IApi"
                 name="WSHttpBinding_IApi">
                 <identity>
                     <certificate encodedValue="AwAAAAEAAAAUAAAAvDJSUOU7j3OZw58oadeaOQ2hFwwgAAAAAQAAAAMCAAAwggH/MIIBaKADAgECAhAsiRVKHUl5gk8EfX3h8Nl8MA0GCSqGSIb3DQEBBAUAMBcxFTATBgNVBAMTDEpKV2NmU2VydmljZTAeFw0xNjA4MTYwNjQ3MDdaFw0zOTEyMzEyMzU5NTlaMBcxFTATBgNVBAMTDEpKV2NmU2VydmljZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAudUXIgHlGJi7R+DJBxqfB9EldfxTk2uhRlc/miG+UEG2049rZzyg8C4buGq6czimSWw+3qdRC5ssBCFvutgsspGD4Yfnthycc9FJJrnJ7XMEi+YuvBy6dhx3VvnqYD2V8lYARbzFcjBJZPJCTfVibR9Q2ztR3fCUOaCax8JqA08CAwEAAaNMMEowSAYDVR0BBEEwP4AQbxiagPbpXbaqlELymH5aDKEZMBcxFTATBgNVBAMTDEpKV2NmU2VydmljZYIQLIkVSh1JeYJPBH194fDZfDANBgkqhkiG9w0BAQQFAAOBgQAnouchd9o4q3fR212HD4aiD5iXXQv6o7VMY4TZPn/+UDaLXEZVB5mbuCh0vnlU2zIaJCN9LuQiQ9/MyjuoTKA2lAMup+hMw5F0bnjeWOdwD6shKBqnLlY44hufbVx0U2rN8n9Yay9oCYSzBnM3WKNXIWc1TeGBJvnpDBnMqqvNeA==" />
                 </identity>

             </endpoint>
         </client>
     </system.serviceModel>

6 客户端调用

 using (var proxy = new Api())
         {
             //此出进行验证
             proxy.ClientCredentials.UserName.UserName = “xxx”;
             proxy.ClientCredentials.UserName.Password = "xxx";

             //在下面调用你的WCF方法
             proxy.SayHello("Vis");
         }

参考:

   http://www.cnblogs.com/leeolevis/archive/2011/05/17/2048710.html

http://www.cnblogs.com/wuhuacong/archive/2011/09/29/2195528.html

WCF之添加自定义用户名密码认证的更多相关文章

  1. WCF的用户名+密码认证方式(转)

    概述 今天在做Master Data Service(后面简称MDS)项目时需要通过WCF来使用MDS的API,从而对MDS的数据进行操作.在这个过程中,遇到了一个棘手的问题,就是在客户端调用Web ...

  2. WCF身份验证之用户名密码认证

    WCF支持多种认证技术,例如Windowns认证.X509证书.Issued Tokens.用户名密码认证等,在跨Windows域分布的系统中,用户名密码认证是比较常用的,要实现用户名密码认证,就必须 ...

  3. Nginx实战之让用户通过用户名密码认证访问web站点

    1.Nginx实战之让用户通过用户名密码认证访问web站点 [root@master ~]# vim /usr/local/nginx/conf/extra/www.conf server { lis ...

  4. nginx让用户通过用户名密码认证访问web页面

    在使用nginx转发的时候,要进行一次用户身份的确认. 1)通过htpasswd命令生成用户名及对应密码数据库文件. [root@bgs-5p173-wangwenting ~]# htpasswd ...

  5. 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点

    一.启动Nginx目录浏览功能  [root@abcdocker extra]# cat w.conf server { listen 80; server_name IP地址; location / ...

  6. Geoserver通过ajax跨域访问服务数据的方法(含用户名密码认证的配置方式)

    Goeserver数据有两种,一种需进行用户密码的权限认证,一种无须用户密码.对于网上跨域访问Geoserver数据的种种方法,对这2种数据并非通用. 笔者将Geoserver官方下载的Geoserv ...

  7. 【WCF】使用“用户名/密码”验证的合理方法

    我不敢说俺的方法是最佳方案,反正这世界上很多东西都是变动的,正像老子所说的——“反(返)者,道之动”.以往看到有些文章中说,为每个客户端安装证书嫌麻烦,就直接采用把用户名和密码塞在SOAP头中发送,然 ...

  8. 【WCF安全】WCF 自定义授权[用户名+密码+x509证书]

    1.x509证书制作(略) 2.直接贴代码 ----------------------------------------------------------------------服务端----- ...

  9. C# 用SoapUI调试WCF服务接口(WCF中包含用户名密码的验证)

    问题描述: 一般调试wcf程序可以直接建一个单元测试,直接调接口. 但是,这次,我还要测试在接口内的代码中看接收到的用户名密码是否正确,所以,单一的直接调用接口方法行不通, 然后就想办法通过soapU ...

随机推荐

  1. 单击Android设备后退键,主屏幕键以及旋转屏幕如何影响Activity的生命周期

    单击设备的后退键,相当于通知Android系统“我已完成activity的使用,现在不需要它了.”接到指令后,系统立即销毁了activity.即调用onPause()->onStop()-> ...

  2. web攻击方式和防御方法

    在http请求报文中载入攻击代码,就能发起对web应用的攻击.通过url查询字段或者表单.http首部.cookie等途径吧攻击代码传入,若这时web应用存在安全漏洞,那内部信息就会遭到窃取! 对we ...

  3. 关于在打包Jar文件时遇到的资源路径问题(一)

    当我们将程序写好,并进行打包成Jar文件时,通常都带有各种资源,这些资源可以是图像或者声音文件,也可以是别的如文本文件或二进制文件等,这些资源都和代码密切相关.例如在一个JPanel类上显示一些可能变 ...

  4. SpringMVC之Controller传递JSON数据到页面

    在Controller中,组装好JSON格式的数据,然后输入到页面,或者通过ajax请求在页面进行解析,都可以做到. 1.Controller /** * JSON DATA TO PAGE VEIW ...

  5. Spark SQL Catalyst源代码分析之TreeNode Library

    /** Spark SQL源代码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心执行流程.SqlParser,和Analyzer,本来打算直接写Optimizer的,可是发 ...

  6. css Gradients(渐变)

    渐变分为4类 1:线性渐变(Linear Gradients)- 向下/向上/向左/向右/对角方向 2:径向渐变(Radial Gradients)- 由它们的中心定义 3:对角渐变 4:角度渐变 以 ...

  7. MSYS2 环境搭建(在Qt Creator可以设置环境变量来进行引用这些库)

    本机环境:Windows XP 32位MSYS2地址:http://sourceforge.net/projects/msys2/ 下载32位版本,地址:http://sourceforge.net/ ...

  8. 人事管理系统 c语言版

    int menu(){ printf("请按提示输入完毕操作!\n");   printf("1.查询员工信息\n");   printf("2.统计 ...

  9. ACE的构建(VC++6.0环境)

    ACE的构建(VC++6.0环境)Windows下ACE的构建1. 将ACE-5.5.zip解压到所需的安装目录,此处以E:/为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE ...

  10. windows程序员进阶系列:《软件调试》之Win32堆

     win32堆及内部结构 Windows在创建一个新的进程时会为该进程创建第一个堆,被称为进程的默认堆.默认堆的句柄会被保存在进程环境块_PEB的ProcessHeap字段中. 要获得_PEB的地址, ...