使用用户名 + SSL 在 WCF 上实现双重安全性的 6 个步骤






4.93/5 (21投票s)
使用用户名 + SSL 在 WCF 上实现双重安全性的 6 个步骤。
目录
- 引言和目标
- 基础传输和消息级安全
- 步骤1:自定义“WsHttp”绑定,设置安全模式和凭据类型
- 步骤2:创建自定义验证器类
- 步骤3:定义运行时行为
- 步骤4:为WCF服务定义SSL
- 步骤5:使用WCF服务
- 步骤6:运行WCF服务
- 我其他的WCF文章
- 历史
引言和目标
在本文中,我们将尝试在WCF服务上应用基于传输加消息的双重安全性。因此,我们将首先尝试理解WCF安全性的基本概念,即传输和消息。一旦我们理解了概念,我们将逐步介绍如何在WCF服务上实现SSL和用户名安全性。
如果您是WCF新手,可以从这里开始。
基础传输和消息级安全
广义上讲,WCF支持两种安全性:传输级别和消息级别。传输是指WCF数据传输的媒介,而消息是指WCF发送的实际数据包。
传输媒介可以是TCP、HTTP、MSMQ等协议。这些传输媒介本身提供了安全功能,例如HTTP可以具有SSL安全性(HTTPS)。WCF能够利用WCF服务调用中的底层传输安全功能。
消息级别安全性通过WS-Security在数据本身中提供。换句话说,它独立于传输协议。消息级别安全性的例子包括使用加密算法加密的消息、使用X509证书加密的消息、使用用户名保护的消息等。
WCF为您提供了单独使用消息级别安全性、单独使用传输级别安全性或两者的组合的选项。如果您有兴趣了解如何单独实现消息级别安全性和传输安全性,可以从这里阅读更多。
最佳安全性是传输和消息的结合。在本文中,我们将逐步了解如何使用“SSL”和使用“Username
”的“WsHttpBinding
”实现双重安全性。
步骤1:自定义“WsHttp”绑定,设置安全模式和凭据类型
第一步是自定义您的“Wshttp
”绑定,设置正确安全模式和凭据类型。安全模式有三种选项:“Transport
”、“Message
”和“TransportWithMessageCredential
”。
由于我们正在实现双重安全性,因此我们需要使用最后一个选项,即“TransportWithMessageCredential
”,其中传输安全性由SSL提供,消息安全性通过“用户名和密码”提供。
我们需要提供的第二件事是凭据类型。有五种不同的凭据类型:无、Windows、用户名、证书和已发布令牌。凭据类型定义了凭据如何在传输层上传递。对于当前情况,我们将选择“UserName
”。
所以总结一下,我们将提供安全模式为“TransportWithMessageCredential
”,消息安全性将由“UserName
”提供。
因此,使用WCF服务模板创建一个WCF服务,并在“web.config”中按以下代码片段所示提供安全模式和凭据类型。
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<!-- UsernameToken over Transport Security -->
<security mode="TransportWithMessageCredential" >
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
步骤2:创建自定义验证器类
自定义“WsHttp
”绑定并设置安全模式和凭据类型后,就该创建自定义类来对提供的用户名进行身份验证了。
要创建自定义类,您需要继承属于“System.IdentityModels.Selector
”的“UserNamePasswordValidator
”类。
以下是“MyValidator
”类的代码片段。我们需要重写“Validate
”方法,并按照以下方式实现身份验证逻辑。
class MyValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if ((userName == "shiv123") && (password == "pass123"))
{
}
else
{
throw new FaultException("Invalid credentials");
}
}
}
如果凭据不正确,我们将引发“FaultException
”错误,WCF客户端可以捕获该错误以显示错误消息。
步骤3:定义运行时行为
所以我们现在已经完成了近一半的工作。我们已经自定义了“WsHttp
”绑定,并创建了进行必要身份验证的自定义类“MyValidator
”。下一步是定义行为。
“Behaviors
”定义了绑定协议上的自定义运行时逻辑。目前,我们需要执行“MyValidator
”类逻辑,以响应WCF客户端在WCF服务中提供的“UserName
”。
要指定行为,请转到“Web.config”文件,然后在“servicecredentials
”标记中,指定指向自定义类“MyValidator
”的“userNameAuthentication
”标记。
<behaviors>
<serviceBehaviors>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyValidator, app_code"/>
</serviceCredentials>
</behavior>
步骤4:为WCF服务定义SSL
我们已经提到传输安全性将由SSL提供,而消息安全性将由“username
”提供。我们已经通过“MyValidator
”类配置了“UserName
”消息安全性,该类在“web.config”文件的行为部分中指定。下一步是为我们的WCF服务配置SSL,即传输安全性。
我们将使用“makecert.exe”,这是Microsoft提供的免费工具,用于启用HTTPS以进行测试。MakeCert(Makecert.exe)是一个命令行工具,它创建一个由系统测试根密钥或另一个指定密钥签名的X.509证书。该证书将证书名称绑定到密钥对的公钥部分。该证书被保存到一个文件、一个系统证书存储或两者兼有。
您可以在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin”中找到它,或者也可以从Windows SDK中找到它。
您可以在“C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\Bin”上的DOS提示符下输入以下内容。请注意,“compaq-jzp37md0”是服务器名称,您需要将其替换为您自己的PC名称。
makecert -r -pe -n "CN= compaq-jzp37md0 " -b 01/01/2000
-e 01/01/2050 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr
localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12
如果您通过命令提示符运行,您应该会看到如下所示的成功消息。
现在是时候将此证书分配给您的IIS网站了。因此,请转到IIS属性,单击目录安全选项卡,您应该会看到服务器证书选项卡。
因此,单击服务器证书选项卡,然后IIS证书向导将引导您完成。在向导中,单击“分配现有证书”。
您可以看到证书列表。“compaq-jzp37md0
”证书是刚才使用“makecert.exe”创建的。
现在尝试在没有“https”的情况下测试站点,您会看到如下所示的错误…这意味着您的证书正在工作。
不要忘记启用 IIS 匿名访问。
我们还需要在WCF服务“Web.config”的“endpoint
”部分进行一些更改,如下所示。您可以看到地址如何指向HTTPS,以及绑定如何使用“mexHttpsBinding
”。
<service name="Service" behaviorConfiguration="ServiceBehavior">
<endpoint address=https:///Service.svc
binding="wsHttpBinding" contract="IService" bindingConfiguration="Binding1">
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
步骤5:使用WCF服务
现在是时候使用服务应用程序来使用WCF了。因此,单击添加服务引用并指定您的服务URL。您将看到一个警告框,如下面的图所示,因为该证书是一个测试证书。所以,请忽略它。
下一步是创建WCF代理客户端对象,并按照下面的代码片段传递凭据。
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(IgnoreCertificateErrorHandler);
ServiceReference1.ServiceClient obj = new ServiceReference1.ServiceClient();
obj.ClientCredentials.UserName.UserName = "shiv123";
obj.ClientCredentials.UserName.Password = "pass123";
Response.Write(obj.GetData(12));
“makecert.exe”创建测试证书。换句话说,它不是由CA签名的。因此,我们需要在我们的ASP.NET客户端使用者中抑制这些错误。所以我们创建了一个名为“IgnoreCertificateErrorHandler
”的函数,该函数即使有错误也会返回true
。如上面的代码片段所示,此函数被作为回调附加到“ServicePointManager.ServerCertificateValidationCallback
”。
public static bool IgnoreCertificateErrorHandler
(object sender, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
return true;
}
步骤6:运行WCF服务
如果一切顺利,您应该能够运行WCF服务。尝试更改用户名和密码,您应该会收到“MyValidator
”类中提供的故障异常消息。
我的其他WCF文章
- WCF FAQ 第5部分 – 事务
- WCF 跟踪 FAQ
- 启用WCF BasicHttpBinding上的Windows身份验证的8个步骤
- BasicHttpBinding 与 WsHttpBinding 之间的区别
- 启用WCF上X.509证书的9个简单步骤
- 在WCF WsHttp绑定上启用HTTPS的7个简单步骤
- 启用 WCF 事务的 6 个步骤
- WCF FAQ 第5部分 – 事务
- 启用 WCF 中仪表化的 4 个步骤
- WCF FAQ 第3部分 – 10个安全相关FAQ
- Windows Communication Foundation FAQ快速入门 第1部分
- Windows Communication Foundation FAQ 快速入门 -
第二部分
历史
- 2010年5月20日:初始发布
如需进一步阅读,请观看以下面试准备视频和分步视频系列。