WCF Security userName/Password

1. Transfer Security
Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"、"消息机密性 (Message Confidentiality)" 和 "交互验证(Mutual Authentication)"。
消息完整性必须确保消息在传输过程中没有被篡改,接收的消息是完整且正确的;消息机密性必须确保消息不会被任何第三方查阅,消息内容不会泄漏给任何非相关人员;而交互认证则是指客户端和服务器必须通过某种信任机制才能建立正确的连接,同时交互认证还要监测并阻止拒绝服务攻击(DOS)。通常的做法是对消息进行数字签名来确保其完整性,使用非对称加密算法来阻止消息内容外泄,而用户名/密码、X.509 数字证书等方式则可以用来验证对方身份,在这里我们主要讲述如何在WCF中使用用户名/密码的身份验证方式.

2. 创建x.509数字证书:

要使用userName/password方式来验证身份,我们需要为服务器装一个证书,创建证书的作用是因为用户名和密码在client和service传输的过程中需要加密,否则就没有安全性了,x.509rd使用非对称加密加技术.用公钥加密客户端用户名和密码,在服务端用私钥来解密,所以我们得创建这样的证书.使用vs2008的tool中的command命令下执行:makecert -r -pe -n "CN=Temp" -ss My -sky exchange  .我们就可以为服务器生成Temp的证书.如下图所示.

点击view可以查看详细信息:

 

 X.509 简单证书介绍:

  X.509给出的鉴别框架是一种基于公开密钥体制的鉴别业务密钥管理。一个用户有两把密钥:一把是用户的专用密钥,另一把是其他用户都可利用
的公共密钥。用户可用常规密钥(如DES)为信息加密,然后再用接收者的公共密钥对DES进行加密并将之附于信息之上,这样接收者可用对应的专用密钥
打开DES密锁,并对信息解密。该鉴别框架允许用户将其公开密钥存放在它的目录款项中。一个用户如果想与另一个用户交换秘密信息,就可以直接从对方
的目录款项中获得相应的公开密钥,用于各种安全服务。更多的可以参考MSDN
3.Solution 结构如下图:
solution:WCFValidationContract WCF contract.
     WCFValidationClient WCF client端.
     WCFValidationServices 主要是实现contract的类
     WCFValidationHost..用于启动WCF.
创建服务
    [ServiceContract]
    public interface IUserName//对应solution中的WCFValidationContract.IUserName
    {
        [OperationContract]
        bool test();
    }
    public class UserName:IUserName//对应solution中的WCFValidationServices.UserName
    {
        #region IUserName Members
        public bool test()
        {
            return true;
        }
        #endregion
    }
我们通过继承 UserNamePasswordValidator 来创建一个自定义验证器。//对应solution中的WCFValidationServices.MyValidation
      public override void Validate(string userName, string password)
        {
            //the follow code is testing only.u can read userName and password from DataBase.
            if (userName != "user" || password != "pwd")
            {
                throw new Exception("Unknown Username or Password");
            }
        }
服务端的配置文件如下:(host的配置文件)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="UserNameBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceCredentials>
            <issuedTokenAuthentication allowUntrustedRsaIssuers="true"></issuedTokenAuthentication>
            <clientCertificate>
              <authentication certificateValidationMode="None"/>
            </clientCertificate>
            <serviceCertificate findValue="Temp" storeLocation="CurrentUser" x509FindType="FindBySubjectName"/>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFValidationServices.MyValidation,WCFValidationServices"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="userBinding">
          <security mode="Message">
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="UserNameBehavior" name="WCFValidationServices.UserName">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="userBinding" name   ="username" contract="WCFValidation.IUserName">
          </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/userName"/>
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>
有时候我们在启动服务的时候会生产如下的错误:
这时我们需要使用微软件提供的WCF Samples中的一个工具FindPrivateKey来长到Temp的私钥文件的位置,然后为ASPNET或NET Service用户分配访问权限
WCF Samples下载地址 http://download.csdn.net/source/792492也可以到MSDN上下载
FindPrivateKey的使用介始: http://msdn.microsoft.com/zh-cn/vbasic/aa717039.aspx
4. 创建客户端

启动服务器后,创建客户端代理文件。注意自动生成的客户端配置文件中包含了服务器数字证书的相关信息。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="username" 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/userName" binding="wsHttpBinding"
          bindingConfiguration="username" contract="IUserName" name="username">
        <identity>
          <certificate encodedValue="AwAAAAEAAAAUAAAAqxw7daba6mcItJ/tKIAFZfz3TCggAAAAAQAAAPcBAAAwggHzMIIBXKADAgECAhAciN6VY5e8ik4b7Ia5KvftMA0GCSqGSIb3DQEBBAUAMBMxETAPBgNVBAMTCE15U2VydmVyMB4XDTA4MTEyMDA2MTQwNloXDTM5MTIzMTIzNTk1OVowEzERMA8GA1UEAxMITXlTZXJ2ZXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALK4gy7ldnVwSjemT3bQjKSEGd/zBjNqYDHf9kwUopwvuHpE287yWD1ytKaYYZf7uEdEtNYKwWeOwSNLEPqxUSW4jF92IqfQwkxa0bQdZQK/Y3TpmseX/hsOtW0FBXV3Ftqq+acrWVkG/J/HFM1eeIyPggVI/QqclrKjBQeikjMdAgMBAAGjSDBGMEQGA1UdAQQ9MDuAEEvEZkpRY3c664NiQiazM3+hFTATMREwDwYDVQQDEwhNeVNlcnZlcoIQHIjelWOXvIpOG+yGuSr37TANBgkqhkiG9w0BAQQFAAOBgQAQLrEU3mnxOlDkKuVx9OatXd0w99I3xMnQOsWvOCITjQrfUeJWz1FOl46pKAXDhJNgfMW133E3ARgUxf+abkJqz9ejhjvzJwx2CJYe843h98fooTPPbSs6rQrfQOxb/KoaxbKoxUaALQsGssEXkN2ImS0jsOUm9aVNnRNWpKMhzA==" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>
以配置文件是由svcutil工具生成的.我们在客户端写以下代码来调用服务:
  UserNameClient aa = new UserNameClient();
aa.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
  aa.ClientCredentials.UserName.UserName = "user";
  aa.ClientCredentials.UserName.Password = "pwd";

  bool flag = aa.test();
  Console.WriteLine(flag.ToString());
  Console.ReadKey();
这时我们可以在控制应用程序中显示True这个值.
当我们输入一个错误的密码时如:
 aa.ClientCredentials.UserName.UserName = "123";
  aa.ClientCredentials.UserName.Password = "123";
客户端就会有异常:
 

 
 这样我们不可以完成了WCF的 userName/password的验证方式,在项目中使用时,我们不必要在每次调用方法的时候设置用户名和密码,我们只要写一个基类就可以了
 
 

转载于:https://www.cnblogs.com/liujiang/archive/2008/11/21/1338384.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保护视力,我写的一个定时提醒的小玩意。

做程序员2年了&#xff0c;感觉视力越来越差。有时候常常工作到忘记休息。于是就想写一个能够定时提醒的小东西(公司不让从网络下载别的程序)。 功能: 1.能够每隔一段时间提醒我休息&#xff0c;做做眼保健操。 2.能够自己设定时间间隔. 运行环境&#xff1a;.ne…

WinCE程序的几种开发方法

文章允许转载,请注明出处和作者:luocq(akay_21cn_com)下面介绍的几种开发方法,还是倾向于Delphi的程序员,如果是熟练的VC程序员,当然VC是不二的选择.1、采用Delphi2007来进行WinCE .net程序开发http://spaces.msn.com/members/GordonLiWei/?partqsayear%3D2005%26amonth%3D12&…

几道Linux驱动相关面试题,你会几题?

1一、Linux基础1、任意3种网络操作的Linux命令,并说明他们的含义 1. ifconfig 命令ifconfig 用于查看和配置 Linux 系统的网络接口。 查看所有网络接口及其状态&#xff1a;ifconfig -a 。 使用 up 和 down 命令启动或停止某个接口&#xff1a;ifconfig eth0 up 和 ifconfig et…

解决Too many open files问题

转载&#xff1a;https://blog.csdn.net/zhuwinmin/article/details/72730288 当用linux做高并发服务器时&#xff0c;会遇到"Too many open files"的错误。 Linux是有文件句柄限制的&#xff08;open files&#xff09;&#xff0c;而且Linux默认不是很高&#xf…

树莓派的这十年

来源 | 新智元编辑 | 袁榭 好困刚刚过完10岁生日的树莓派&#xff0c;早已褪去了当年廉价电脑教具的外衣&#xff0c;一跃成为全球业界首屈一指的微型电脑品牌。为啥叫「Raspberry Pi」&#xff1f;从某种意义上讲&#xff0c;「树莓」这个命名方式其实很单纯&#xff0c;因为大…

layui 在springboot2.x 时,页面展示不了layui的问题

[[]]是thymeleaf的内联表达式&#xff0c;在script上加 th:inline"none" 即可 报错信息 转载于:https://www.cnblogs.com/SeaWxx/p/10287505.html

ArcGIS Flex API 中的 Flex 技术(一)--事件

作者&#xff1a;Flyingis 本文严禁用于商业目的&#xff0c;如需转载请注明作者及原文链接&#xff0c;其他疑问请联系&#xff1a;dev.vip#gmail.com 在ArcGIS Flex API中探索Flex使用是一种不错的学习方法&#xff0c;可以相互辅助理解ArcGIS Flex API和Flex&#…

C++11 bind注意事项(传引用参数的时候)

默认情况下&#xff0c;bind的那些不是占位符的参数被拷贝到bind返回的可调用对象中。 当需要把对象传到bind中的参数中时&#xff0c;需要使用ref或者cref。 例如&#xff1a;

四元數與旋轉

为什么80%的码农都做不了架构师&#xff1f;>>> 在討論「四元數」之前&#xff0c;我們來想想對三維直角座標而言&#xff0c;在物體旋轉會有何影響&#xff0c;可以擴充三維直角座標系統的旋轉為三角度系統&#xff08;Three-angle system&#xff09;&#xff0c…

玩一下数组

来源&#xff1a;嵌入式大杂烩数组是最基本的数据结构&#xff0c;关于数组的面试题也屡见不鲜&#xff0c;本文罗列了一些常见的面试题&#xff0c;仅供参考。目前有以下18道题目。数组求和求数组的最大值和最小值求数组的最大值和次大值求数组中出现次数超过一半的元素求数组…

将GDB中的输出定向到文件

将所有栈信息保存到文件11中 在gdb中: set logging file 11 set logging on thread apply all bt set logging off 结束之后&#xff0c;在相关目录下查看11文件

不生孩子能怎么办?

你会选择不婚或者丁克的生活吗&#xff1f;你是否也想过未来养老的问题呢&#xff1f;如果想过&#xff0c;你对此又有什么规划呢&#xff1f;欢迎留言讨论&#xff01;本文原创公众号&#xff1a;不会笑青年&#xff0c;授权转载请联系微信(laughyouth369)&#xff0c;授权后&…

__attribute__((always_inline))

__attribute__((always_inline))的意思是强制内联&#xff0c;所有加了__attribute__((always_inline))的函数再被调用时不会被编译成函数调用而是直接扩展到调用函数体内&#xff0c;例子如下&#xff1a; define inline __attribute((always_inline))的意思就是用 inline 代…

应用程序池优化配置方案(IIS7、IIS7.5)

定义&#xff1a; 是将一个或多个应用程序链接到一个或多个工作进程集合的配置&#xff0c;该池中的应用程序与其他应用程序被工作进程边界分隔&#xff0c; 一、一般优化方案 1.基本设置 【1】队列长度&#xff1a;默认1000&#xff0c;将原来的队列长度65535 【2】启动32位应…

深圳的房价跌了

我很久没有关注深圳的房价了&#xff0c;上一篇关于深圳房价的文章好像还是几个月之前的&#xff0c;几个月之前&#xff0c;我一个同学买房&#xff0c;跟我咨询了下&#xff0c;然后就写了一篇文章。现在不要着急买房这篇文章从那个时候到现在已经一年了&#xff0c;前几天跟…

Springboot 使用Mybatis对postgreSQL实现CRUD

目录结构 1、创建一个springboot项目 选择Web、Mabatis、postgreSQL 2、在application中写入配置文件 1 #配置数据源 2 spring.datasource.platformpostgres 3 spring.datasource.urljdbc:postgresql://127.0.0.1:5432/postgres 4 spring.datasource.usernamepostgres 5 spring…

不得不说,这是我面过的最优秀的Linux运维!

Linux可以说是运维之“本”。无论中小企业还是大厂&#xff0c;现在的企业有95%甚至更多是使用Linux服务器。而对于Linux运维来说&#xff0c;Linux基础越扎实、会的工具越多&#xff0c;能解决的问题就越多&#xff0c;技术也能走的更远。Linux&#xff0c;甚至可以说是进入IT…

一个中科大「差生」的8年程序员工作总结

今年终于从大菊花厂离职了&#xff0c;离职前收入大概60w不到吧&#xff01;在某乎属于比较差的&#xff0c;今天终于有空写一下自己的职场故事&#xff0c;也算是给自己近8年的工作做个总结复盘。近8年有些事情做对了&#xff0c;也有更多事情做错了&#xff0c;在这里记录一下…

Java IO File

#file file的一些方法&#xff0c;因为windows和Linux开发环境的问题&#xff0c;在file中最好统一用 / 输出流操作 转载于:https://www.cnblogs.com/cykfory/p/10294981.html

gtest使用例子

最近使用gtest进行单元测试&#xff0c;采用打桩的形式。关于gtest的详细说明就不多说了&#xff0c;网上的资料一大堆。主要讲解使用时的参数如何配置以及遇到的问题。下面的例子模拟是加、减、乘、除四则运算&#xff0c;前提是不知道加、减、乘、除四则运算是如何实现的。 …