.Net 配置wcf x509证书加密和用户验证

最近想搭一套统一认证和单点登录的框架系统,但是在wcf 加密和用户验证这块停留不少时间,不是因为技术不行,感觉是人懒了,不原因仔细看东西,但是最终解决了,分享一下过程(都是抄袭的哈)

1.首先创建wcf服务端站点(不多说);

a)客户端中创建一个类,类名随意,这里咱们是要作为服务器端验证用户名和密码用的,建议密码将来存储到数据库中方便修改:

public class Class1 : UserNamePasswordValidator
    {
        public override void Validate(string userName, string password)
        {
            if (userName != "dd" || password != "dd")
            {
                throw new SecurityTokenException("Unknown Username or Password");
            }
        }
    }

b)接下来是服务端的web.config的配置这块很重要,都是集中在system.serviceModel中

<system.serviceModel>
    <services>
      <service name="TestWcfService.Service1" behaviorConfiguration="CustomBehavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="wsHttpBinding" contract="TestWcfService.IService1" 
                  bindingConfiguration="CustomWsHttpBinding">
          <!-- 
              部署时,应删除或替换下列标识元素,以反映
              在其下运行部署服务的标识。删除之后,WCF 将
              自动推导相应标识。
          -->
          <identity>
            <dns value="ParkingServer"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="CustomWsHttpBinding" >
          <!--是用证书加密方式-->
          <security mode="Message">
            <!--<message clientCredentialType="Certificate"/>-->
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CustomBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="None"/>
            </clientCertificate>
            <serviceCertificate findValue ="ParkingServer"
                                x509FindType="FindBySubjectName"
                                storeLocation="LocalMachine"
                                storeName="My"/>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="TestWcfService.Class1,TestWcfService"/>

          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

c)服务端创建测试证书

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

在电脑里找 makecert这个exe不行就下载一个,专门做证书的东西,这样做好后运行程序一般都会出现没有证书集啥的错误,这事因为你的证书没有赋予访问权限,打开部署的电脑或需要调试的电脑

C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys  这个链接,找到你刚才创建的证书,这里的证书名字都是乱码,防止盗窃,所以你得根据创建的时间来判断了,右键属性赋予everyone权限即可;

这里得提醒一下,如果找不到就再创建一次证书吧哈,但是如果创建重复key值的会出现“发现多个证书”类似于这样的提示,如果出现,你需要运行mmc.exe 管理器,添加“证书”项后把多余的证书干掉即可;

顺便说一下:如果部署后出问题了最好把调试模式打开 应该在 system.web标签里加,具体叫什么忘记了哈;

2.创建客户端验证站点;

a.开始创建客户端代码,新建一个普通站点,引用服务,将服务端的地址黏贴进去,点确定即可,客户端随便建立一个按钮把测试代码放入:

 Service1Client client = new Service1Client();

               client.ClientCredentials.UserName.UserName = "dd1";
                client.ClientCredentials.UserName.Password = "dd1";

//测试方法                

string result = client.GetData(1111);
                this.txtResult.Text = result;

 

b.客户端增加验证重写(避开验证)

要说明的是:因为我们的证书并不是真正意义上的证书,只是测试生成的,所以这个证书并不会通过验证,所以当我们客户端访问服务的时候会报错,所以需要在客户端添加一个自己的X509证书验证方法,这里为了测试方面,我们重新的Validate方法是空的,即不做任何认证判断

public class MyX509Validator : X509CertificateValidator
    {
        public override void Validate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate)
        {
            string a = "dd";
        }
    }

这些都是会在配置文件中体现的。

 

c.客户端的配置文件

<system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1">
                    <security>
                        <message clientCredentialType="UserName" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:55577/Service1.svc" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="WSHttpBinding_IService1"  behaviorConfiguration="myClientBehavior" >
                <identity>
                    <dns value="ParkingServer" />
                </identity>
            </endpoint>
        </client>

    <behaviors>
      <endpointBehaviors>
        <behavior name="myClientBehavior">
          <clientCredentials>
            <serviceCertificate>
              <authentication certificateValidationMode="Custom" customCertificateValidatorType="WcfClient2.MyX509Validator,WcfClient2" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>

  </system.serviceModel>

 

到这里先告一段落,我想说的是,wcf验证和加密方式我还是有点不明白其中的原理,写下此文章只是给自己留个记录,待后续学习用

提醒一下自己:在配置客户端验证类的是后要放在解决方案的根目录下,然后再配置到webconfig中去,否则会报“需要引用其他类”的错误,包括mvc的webservice接口也一样

参考链接:

http://blog.csdn.net/zxz414644665/article/details/9308055

http://www.oschina.net/question/565065_57427

wcf验证模式:

http://www.cnblogs.com/artech/archive/2011/06/13/Authentication_052.html

http://www.cnblogs.com/xiaozhuang/archive/2008/04/30/1177399.html

国外的文章

http://www.codeproject.com/Articles/36683/simple-steps-to-enable-X-certificates-on-WCF

测试加密:

http://www.cnblogs.com/server126/archive/2011/12/30/2307258.html

 

 

转载于:https://my.oschina.net/handong9622/blog/793441

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值