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>