65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (21投票s)

2010年5月20日

CPOL

7分钟阅读

viewsIcon

117644

downloadIcon

2823

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

目录

引言和目标

在本文中,我们将尝试在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文章

  1. WCF FAQ 第5部分 – 事务
  2. WCF 跟踪 FAQ
  3. 启用WCF BasicHttpBinding上的Windows身份验证的8个步骤
  4. BasicHttpBinding 与 WsHttpBinding 之间的区别
  5. 启用WCF上X.509证书的9个简单步骤
  6. 在WCF WsHttp绑定上启用HTTPS的7个简单步骤
  7. 启用 WCF 事务的 6 个步骤
  8. WCF FAQ 第5部分 – 事务
  9. 启用 WCF 中仪表化的 4 个步骤
  10. WCF FAQ 第3部分 – 10个安全相关FAQ
  11. Windows Communication Foundation FAQ快速入门 第1部分
  12. Windows Communication Foundation FAQ 快速入门 - 第二部分

历史

  • 2010年5月20日:初始发布

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.