WCF实现自定义用户名和密码验证,并以https传输

 

    WCF支持多种认证技术,例如Windowns认证、X509证书、Issued Tokens、用户名密码认证等,用户名密码认证还是比较常用的,要实现用户

名密码认证,就必须需要X509证书,因为需要X509证书这种非对称密钥技术来实现WCF在Message传递过程中的加密和解密,要不然用户名和密
码就得在网络上明文传递!
   客户端把用户名和密码用公钥加密后传递给服务器端,服务器端再用自己的私钥来解密,然后传递给相应的验证程序来实现身份验证。
   1.先实现自定义的验证类:
    在项目中添加引用:System.IdentityModel
   2.新建一个类,继承于System.IdentityModel.Selectors.UserNamePasswordValidator,重写Validate方法
     验证失败抛出异常SecurityTokenException  
     if (!(userName == "zhaoli" && password == "123"))
     {
        throw new FaultException("用户名或密码不正确");
     }
   3.WCF配置工具打开web.config开始配置
     (1)先新建个绑定,选"wsHttpBinding",切换到安全性,模式选择“Message",服务在消息级别对客户端进行身份验证时所使用的客户
端凭证类型(MessageClientCredentialType),采用“用户名”;
     //下面的步骤就是实现在服务端使用X509证书
     (2)高级-->服务行为,取个名字;
         a.添加个扩展:ServiceCredentials;
         b.展开,选中”serviceCertificate",设置如下:
           FindValue-"MyEggSoft"
           StoreLocation-"LocalMachine"
           StoreName-"My"
           X509FindType-"FindBySubjectName"
         c.选中“serviceCredentials",设置
           UserNamePasswordValidationMode--"Custom",
           CustomUserNamePasswordValidationType--"空间名.类名,动态链接库名"(注:在步骤1中实现的类)
    (3)新建个“服务”,将它与步骤(1)中的相绑定,终结点地址直接用基地址,并指定它的BehaviourConfiguration为步骤(2)中设置的
   4.发布到IIS上,报一个错误”密钥集不存在“,原因在于IIS帐户对私钥文件无读写权限,解决方案采用FindPrivateKey
     FindPrivateKey My LocalMachine -n "CN=MyEggSoft" (MyEggSoft就是证书的名字”
     找到私钥文件所在路径(一般在C:\ProgramData\Microsoft\CryPto\RSA\MachineKeys,这是个隐藏目录)。安全:NetWork Service以读写权限
   5.客户端调用(注:要调用成功,客户端必须有相应的数字证书:MyEggSoft",否则无法建立SSL通道)
            try
            {
                res = client.GetData(123);
                Console.WriteLine(res);
            }
            catch (FaultException ex)
            {
                throw new Exception(ex.Message);
            }
   6.若还想实现https,配置应该修改如下:
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
          </security>
   
posted @ 2012-07-10 13:01  阿土仔  阅读(2444)  评论(0编辑  收藏  举报