zoukankan      html  css  js  c++  java
  • 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>
       
  • 相关阅读:
    【日语】标日初级上册单词(5-8)1
    【日语】标日初级上册单词(1-4)1
    【日语】计算机日语
    百家姓日语
    【日语】动物名称日语单词集合
    【日语】日语常用会话1000句
    【日语】编程相关日语词汇
    【日语】日语N5学习
    【日语】日语新闻核心词汇
    使用uni-app开发微信小程序之登录模块
  • 原文地址:https://www.cnblogs.com/bearhb/p/2584446.html
Copyright © 2011-2022 走看看