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. hibernate简单介绍

    1.   Hibernate是什么? hibernate是 轻量级的 ORM 框架. ORM全称object/relationmapping [对象/关系映射]. Hibernate主要用来实现Jav ...

  2. jquery特效 幻灯片效果

    jquery特效 幻灯片效果,效果图如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Cont ...

  3. GNOME界面简单使用

    GNOME界面 CentOS下的文件夹打开方式,默认是打开一个文件夹就重新的打开一个窗口,并不是在原有的文件夹中显示要打开文件夹的内容. 怎么修改: 打开任意一个文件夹. Edit --> pr ...

  4. asp.net检查验证字符串是否为纯数字方法小结

    原文  asp.net检查验证字符串是否为纯数字方法小结 在asp.net中验证字符串是不是为数字我们没有像php中那么多丰富的函数来直接使用,这里我整理了一些比较实例的验证字符串是否为纯数字方法代码 ...

  5. Windows 7如何建立一个FTP的快捷方式

    原来,使用Windows XP的时候,在IE6的地址栏里输入FTP服务器的地址,就可以打开一个资源管理器的界面来管理文件.但是,随着IE的版本的提升或是装了Windows 7,原来的这种方法就不能用了 ...

  6. 适用函数ALSM_EXCEL_TO_INTERNAL_TABLE把excel文件传输到内表中

    FM:ALSM_EXCEL_TO_INTERNAL_TABLE 是上载Excel文件的一个函数,但是这个函数有两个限制. 一是每个CELL只能导入前50个字符,二是如果超过9999行,行号会初始化为从 ...

  7. Delphi的String内存结构(够清楚) good

    变量s的内存结构为(字符串编码)A8 03 (字符宽度)01 00 (引用计数)FF FF FF FF (字符串长度)0A 00 00 00 (实际内容)31 32 33 34 35 36 37 38 ...

  8. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  9. Swift - 告警框(UIAlertView)的用法

    1,下面代码创建并弹出一个告警框,并带有“取消”“确定”两个按钮 (注:自IOS8起,建议使用UIAlertController) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...

  10. HDU 1240——Asteroids!(三维BFS)POJ 2225——Asteroids

    普通的三维广搜,须要注意的是输入:列,行,层 #include<iostream> #include<cstdio> #include<cstring> #incl ...