目录
- 介绍和目标
- 步骤1:使用WCF项目创建一个简单的服务
- 步骤2:在服务的web.config文件中启用传输级安全性
- 步骤3:绑定绑定并指定HTTPS配置
- 步骤4:启用Web应用程序HTTPS
- 步骤5:在Web应用程序中使用服务
- 步骤6:禁止HTTPS错误
- 步骤7:享受成功
- 源代码
介绍和目标
当我们谈论WCF安全性时,有两种方式:传输级安全性和消息级安全性。传输级安全性只不过是协议的内置安全性。在消息层级的安全性方面,我们需要对数据进行加密,换句话说,安全性被注入数据本身。在本文中,我们将研究如何使用WsHttp绑定实现传输级安全性。我们不需要为运输级别的安全性做更多的开发,因为它更多的是协议固有的安全模型。在本文中,我们将实现使用HTTPS作为传输安全性的WsHttp。
我在WCF,WPF,WWF,SharePoint,设计模式,UML等方面收集了大约400个FAQ问题和答案。请随时从我的网站下载这些FAQ PDF:http : //www.questpond.com。
步骤1:使用WCF项目创建一个简单的服务
第一步是创建一个简单的WCF项目。所以点击新建项目并选择WCF服务项目。默认情况下,WCF项目创建一个默认功能GetData()
。我们将使用与此样本相同的功能。
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
步骤2:在服务的web.config文件中启用传输级安全性
下一步是在WsHttp绑定中启用传输安全性。这是使用“安全”XML标签完成的,如以下代码片段所示:
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
步骤3:绑定绑定并指定HTTPS配置
我们现在需要绑定端点。所以使用该bindingConfiguration
标签来指定绑定名称。我们还需要指定服务所在的地址。请注意地址标签中的HTTS。
更改mexHttpBinding
到mexHttpsBinding
第二个终点。
<service name="WCFWSHttps.Service1" behaviorConfiguration="WCFWSHttps.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="https://localhost/WCFWSHttps/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="TransportSecurity" contract="WCFWSHttps.IService1"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
</service>
在serviceMetadata
,我们也需要改变httpGetEnabled
对httpsGetEnabled
。
<serviceBehaviors>
........
.........
<serviceMetadata httpsGetEnabled="true"/>
.........
.........
</serviceBehaviors>
步骤4:启用Web应用程序HTTPS
现在我们完成了WCF服务项目创建和必要的配置更改,现在是编译WCF服务项目并将其托管在启用了HTTPS的IIS应用程序中的时候了。
我们将使用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匿名访问。
步骤5:在Web应用程序中使用服务
现在是在ASP.NET网络中使用服务应用程序的时候了。所以点击添加服务参考并指定您的服务URL。您将看到如下图所示的警告框。当我们使用makecert.exe时,我们没有将主机名指定为服务URL。所以只要让它走了
步骤6:禁止HTTPS错误
' makecert.exe '创建测试证书。换句话说,它不是由CA签署的。所以我们需要在ASP.NET客户端消费者中抑制这些错误。我们创建了一个函数IgnoreCertificateErrorHandler
,即使有错误也返回true。此函数作为回调附加ServicePointManager.ServerCertificateValidationCallback
。
在相同的代码中,您还可以看到调用该GetData
函数的服务消耗代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebApplicationConsumer.ServiceReference1;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
namespace WebApplicationConsumer
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(IgnoreCertificateErrorHandler);
Service1Client obj = new Service1Client();
Response.Write(obj.GetData(12));
}
public static bool IgnoreCertificateErrorHandler(object sender,
X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
}
}
步骤7:享受成功
现在到最简单的步骤,编译您的ASP.NET客户端并享受成功。
源代码
我还附上了包含客户端和服务的源代码。