最近想搭一套统一认证和单点登录的框架系统,但是在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